【发布时间】:2017-06-20 12:24:29
【问题描述】:
我想在相同数据集的子集上执行相同的 rda 分析序列(拟合模型、测试模型、轴和术语的显着性,绘制数据)。因此我写了一个函数。现在的问题是,当我想测试轴时,对 anova.cca 函数的调用在函数中无法正常工作。找不到 Y.sub 数据集
eval(expr, envir, enclos) 中的错误:找不到对象 'RV.sub'
最小的工作示例:
library(vegan)
data(dune)
data(dune.env)
rda.subsetfunc <- function(RV, Y){
#RV.sub <- subset(RV, !Y$Use%in%c("BF"))
#Y.sub <- subset(Y, !Y$Use%in%c("BF"))
RV.sub <- RV; Y.sub <- Y
rda.mod <- rda(RV.sub ~ Manure, Y.sub)
axis.test <- anova(rda.mod, by = "axis")
return(list(rda.mod, axis.test))
}
rda.subsetfunc(RV = dune, Y = dune.env)
我发现了一些其他相关问题,例如here,但这似乎比我所做的要复杂得多。我试图实现 here 中提到的 do.call 方法,但我无法让它工作。如果在不深入研究函数的情况下真的不可能做到这一点,我会找到一种围绕它进行编程的方法。但对我来说,感觉就像我正在尝试做一些完全有意义的事情。因此,我做错事的可能性可能比我做不可能的事的可能性更大。
【问题讨论】:
-
我在输入原始问题时犯了一个愚蠢的错误。我最初输入了
rda.subsetfunc(RV = dune, Y = Y.sub),由于明显的原因它不起作用。感谢@chi-pak 让我意识到 -
这不是问题,因为 RV.sub 是 X 矩阵而不是 Y 列。这就是 rda 函数的工作方式。如果我省略 anova-function ,我的函数可以正常工作。那就是造成麻烦的那个。顺便说一句,我真的很感谢你的帮助!
-
来自 rda 的帮助页面。
data(dune) data(dune.env) dune.Manure <- rda(dune ~ Manure, dune.env)所以 RV.sub 不在 Y.sub 中是正确的。 -
是的,你是对的,但我仍然认为这是问题的一部分。看看
dune.Manure。它显示了这一点:rda(formula = dune ~ Manure, data = dune.env)。由于某种原因,此dune.Manure在parent环境中查找变量...如果您在parent中声明RV.sub <- dune,则该函数不会返回错误。 -
这是
anova.cca(..., by="axis")中的一个范围界定问题,它在更新公式时应该会从几个不同的环境中找到项目。嵌入功能真的可能会失败。但是,github.com/vegandevs/vegan 中重新设计的函数似乎适用于此示例。