anova.cca 在用户定义的函数中找不到对象
anova.cca cannot find object within user defined function
我想在相同数据集的子集上执行相同的 rda 分析序列(拟合模型、测试模型、轴和项的显着性、绘制数据)。因此我写了一个函数。现在的问题是,当我想测试轴时,对 anova.cca 函数的调用在函数内无法正常工作。它找不到 Y.sub 数据集
Error in eval(expr, envir, enclos) : object 'RV.sub' not found
最小工作示例:
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 but that seems be a lot more complicated than what I am doing. I tried to implement the do.call approach as is mentioned here,但我无法让它工作。如果不真正深入研究函数就真的不可能做到这一点,我会找到一种围绕它进行编程的方法。但对我来说,感觉就像我在尝试做一些完全有意义的事情。所以我做错事的可能性比我做不可能做的事情更有可能。
这是 anova.cca(..., by="axis") 中的一个范围界定问题,它应该在更新公式时从几个不同的环境中找到项目(我不会深入讨论技术问题细节)。你真的不能嵌入函数来分析轴的意义。这是一个已知的问题。我们已经在 vegan 的开发版本中解决了这个问题。 https://github.com/vegandevs/vegan 中重新设计的函数似乎适用于此示例。所有的排序和意义功能在那里都发生了根本性的变化,它们还没有完全完成。我们计划在 2017 年最后一个季度以 vegan 2.5-0 的形式发布它们,但它们尚未完成。
问题是 anova.cca(..., by = "axis")
必须找到它在函数中构建的项目,此外它还可以找到构建原始模型时可用的项目,但找不到您在其中生成的项目嵌入函数的函数。您必须通过使您的嵌入函数将其对象写在可以找到这些对象的地方来避免这种情况。最简单(但很脏)的解决方案是使用 <<-
将它们写入父环境。您的函数的以下版本添加了这个 <<-
并且似乎在 vegan 2.4-3
中工作
rda.subsetfunc <- function(RV, Y){
RV.sub <<- RV; Y.sub <- Y
rda.mod <- rda(RV.sub ~ Manure, Y.sub)
axis.test <- anova(rda.mod, by = "axis")
list(rda.mod, axis.test)
}
rda.subsetfunc(RV = dune, Y = dune.env)
我想在相同数据集的子集上执行相同的 rda 分析序列(拟合模型、测试模型、轴和项的显着性、绘制数据)。因此我写了一个函数。现在的问题是,当我想测试轴时,对 anova.cca 函数的调用在函数内无法正常工作。它找不到 Y.sub 数据集
Error in eval(expr, envir, enclos) : object 'RV.sub' not found
最小工作示例:
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 but that seems be a lot more complicated than what I am doing. I tried to implement the do.call approach as is mentioned here,但我无法让它工作。如果不真正深入研究函数就真的不可能做到这一点,我会找到一种围绕它进行编程的方法。但对我来说,感觉就像我在尝试做一些完全有意义的事情。所以我做错事的可能性比我做不可能做的事情更有可能。
这是 anova.cca(..., by="axis") 中的一个范围界定问题,它应该在更新公式时从几个不同的环境中找到项目(我不会深入讨论技术问题细节)。你真的不能嵌入函数来分析轴的意义。这是一个已知的问题。我们已经在 vegan 的开发版本中解决了这个问题。 https://github.com/vegandevs/vegan 中重新设计的函数似乎适用于此示例。所有的排序和意义功能在那里都发生了根本性的变化,它们还没有完全完成。我们计划在 2017 年最后一个季度以 vegan 2.5-0 的形式发布它们,但它们尚未完成。
问题是 anova.cca(..., by = "axis")
必须找到它在函数中构建的项目,此外它还可以找到构建原始模型时可用的项目,但找不到您在其中生成的项目嵌入函数的函数。您必须通过使您的嵌入函数将其对象写在可以找到这些对象的地方来避免这种情况。最简单(但很脏)的解决方案是使用 <<-
将它们写入父环境。您的函数的以下版本添加了这个 <<-
并且似乎在 vegan 2.4-3
rda.subsetfunc <- function(RV, Y){
RV.sub <<- RV; Y.sub <- Y
rda.mod <- rda(RV.sub ~ Manure, Y.sub)
axis.test <- anova(rda.mod, by = "axis")
list(rda.mod, axis.test)
}
rda.subsetfunc(RV = dune, Y = dune.env)