我正在使用包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的数据框。无论我怎么说,它的行为都是一样的。
答案 0 :(得分:9)
我想这是另一个问题 - 由于S4方法的解析树中的环境定义(为什么我不是S4的忠实粉丝的原因之一)...
可以通过在dat周围添加引号来显示:
> 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”放在全局环境中并在之后删除它。
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)
}
编辑: 为了清楚起见,这实际上是关于可能的最差解决方案,但我无法找到更好的解决方案。如果其他人为您提供了一个解决方案,您无需触及您的全球环境,请务必使用该解决方案。