gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:31:04 24 4
gpt4 key购买 nike

我正在使用包 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 的数据框。无论我怎么称呼它,它的行为都是一样的。

最佳答案

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

编辑:
只是为了清楚起见,这实际上是最糟糕的解决方案,但我无法找到更好的解决方案。如果其他人为您提供了一种无需接触全局环境的解决方案,请务必使用该解决方案。

关于r - 为什么我不能将数据集传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3661500/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com