代码之家  ›  专栏  ›  技术社区  ›  Maiasaura

为什么我不能将数据集传递给函数?

r
  •  7
  • Maiasaura  · 技术社区  · 15 年前

    我在用包裹 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'
    

    results=lapply(list_of_datasets, analyze) ,它不起作用。

    例2:

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

    很好用。所以在某种意义上,它忽略了参数,只是字面上寻找一个名为dat的数据帧。不管我怎么称呼它,它的行为都是一样的。

    1 回复  |  直到 15 年前
        1
  •  9
  •   Joris Meys    15 年前

    我想这是另一个问题,因为在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)
    }
    

    编辑: 为了清楚起见,这确实是最糟糕的解决方案,但我找不到更好的解决方案。如果有人给你一个解决方案,你不必接触你的全球环境,一定要使用这个。