2010-09-07 97 views
6

我正在使用包glmulti将模型拟合到多个数据集。如果我一次适合一个数据集,一切都可以正常工作。为什么我不能将数据集传递给函数?

因此,例如:

output <- glmulti(y~x1+x2,data=dat,fitfunction=lm) 

的作品就好了。

但是,如果我创建一个包装的功能,像这样:

analyze <- function(dat) 
{ 
out<- glmulti(y~x1+x2,data=dat,fitfunction=lm) 
return (out) 
} 

根本不起作用。我得到的错误是

error in evaluating the argument 'data' in selecting a method for function 'glmulti' 

除非有一个名为dat的数据帧,否则它不起作用。如果我使用results=lapply(list_of_datasets, analyze),它不起作用。 那么给了什么?没有我说的包装,我不能通过这个函数来获取数据集列表。如果任何人对这种情况发生的原因或想法有所了解或想法,那就太好了。

例子2:

dat=list_of_data[[1]] 
analyze(dat) 

工作正常。因此,从某种意义上说,它忽略了参数,只是在寻找名为dat的数据帧。无论我称之为什么,它的表现都是一样的。

回答

8

我想这是 - 可是问题另一人由于在S4方法解析树环境的定义(为什么我不是S4的大风扇的resons之一...)

它可以

> analyze <- function(dat) 
+ { 
+ out<- glmulti(y~x1+x2,data="dat",fitfunction=lm) 
+ return (out) 
+ } 
> analyze(test) 
Initialization... 
Error in eval(predvars, data, env) : invalid 'envir' argument 

你应该首先将这个信息发送到包的维护者,因为他们知道他们是如何处理国内的环境:通过添加围绕DAT报价显示。他们将不得不调整功能。

对于自己而言,非常脏的解决方法是将“dat”放入全局环境中,然后将其删除。

analyze <- function(dat) 
{ 
assign("dat",dat,envir=.GlobalEnv) # put the dat in the global env 
out<- glmulti(y~x1+x2,data=dat,fitfunction=lm) 
remove(dat,envir=.GlobalEnv) # delete dat again from global env 
return (out) 
} 

编辑: 只是为了清楚起见,这实在是对最坏的解决方案成为可能,但我不能设法找到更好的东西。如果有人给你一个解决方案,你不需要触及你的全球环境,那么一定要用那个解决方案。

+0

非常感谢Joris。我真的必须坐下来研究S4方法。至少现在我可以看到这种解决方法的行为。干杯。 – Maiasaura 2010-09-07 19:38:01

+0

只要在工作区中没有名为“dat”的对象,它就表现良好。如果是这样,那个将被assign()函数覆盖。这是你一定要避免的...... – 2010-09-07 19:43:37

+1

不是S4和.GlobalEnv再次:拍额头:。 – 2010-09-09 10:46:10

相关问题