基于步骤()的用户定义函数给出:eval(expr、envir、enclose)中的错误:object';X';找不到
我正在尝试构建一个函数,该函数围绕着基于步骤()的用户定义函数给出:eval(expr、envir、enclose)中的错误:object';X';找不到,r,vegan,R,Vegan,我正在尝试构建一个函数,该函数围绕着素食者包中的ordiR2step()函数。此函数基于step()函数 这是在函数之外工作得非常好的代码: install.packages("vegan") require(vegan) data(mite) data(mite.env) #explanatory variables mite.hel = decostand(mite, "hel") #response variable mod0 <-
素食者包中的ordiR2step()
函数。此函数基于step()
函数
这是在函数之外工作得非常好的代码:
install.packages("vegan")
require(vegan)
data(mite)
data(mite.env) #explanatory variables
mite.hel = decostand(mite, "hel") #response variable
mod0 <- rda(mite.hel ~ 1, mite.env) # Model with intercept only
mod1 <- rda(mite.hel ~ ., mite.env) # Model with all explanatory variables
step.res <- ordiR2step(mod0, scope = formula(mod1), direction="forward")
step.res$anova
forward <- function(X, Y) {
intercept <- rda(X ~ 1, data = Y) # Model with intercept only
model <- rda(X ~ ., data = Y) # Model with all explanatory variables
# this is where debugging is stuck
forStep <- ordiR2step(object=intercept, scope = formula(model),
direction = "forward", trace = FALSE)
list(forStep$anova)
}
forward(mite.hel, mite)
同样的错误。。。没有骰子。。。有什么建议吗?谢谢你的时间 如果不打开或rd2step()
的内部结构,我认为这是不可能的。该错误是由ordiParseFormula()
引起的,此时对它的调用被深深地埋藏在调用堆栈中。我的意思是,这些函数是为了交互工作而编写的,当您开始将它们嵌入到其他函数中时,就不必下赌注了。我会看一看有问题的函数,看看我们是否能改进它以提供帮助。问题实际上是当ordiParseFormula()
开始为正向选择链中的下一个模型解析公式时……它在少数位置寻找X
,而不是在函数forward()
的执行帧中。调用堆栈确实很深。似乎,OrdParseFormula(…,envdepth=6)
将获取数据(默认值为envdepth=2
)。当update()
尝试更改模型时,会触发该错误。似乎无法更改envdepth
值。也许你有一些秘密议程,但是对于这个特定的任务,没有必要将这三个命令包装在forward()
:你可以直接发出这些命令,然后分析就可以毫无问题地运行了。似乎有两个纯素开发人员在这个案例中,我得到了很好的帮助!谢谢你的评论。事实上,我确实有一个秘密议程,这里我只提供了最简单的例子来重现我试图规避的错误。我正在尝试许多不同的rda模型,这些模型结合了dbMEMs,因此它对于自动化所选空间结构的探索和可视化非常有用。虽然我还将错误跟踪到了update()
,但我没有跟踪,甚至无法说出调用ordiParseformula()
的位置/方式。。。因此,我已经达到了自己调试技能的极限(相当卑微)。无论如何,我相信你的话,我不能更改envdepth
值,所以现在我只在运行函数之前在全局环境中定义对象。不过,如果你真的弄明白了这一点,我想可能还有其他感激的探索者会尝试包装ordistep()
,以测试一些很酷的模型选择应用程序,并捆绑一些其他功能。干杯,谢谢你的帮助!
forward2 <- function(X, Y) {
intercept <- do.call("rda",list(X ~ 1, data = Y))
model <- do.call("rda", list(X ~ ., data = Y))
forStep <- ordiR2step(object=intercept, scope = formula(model),
direction = "forward", trace = FALSE)
list(forStep$anova)
}
forward2(mite.hel, mite.env)