anova.cca在用户定义的函数

时间:2017-06-20 12:24:30

标签: r function object vegan

我想在相同数据集的子集上执行相同的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,但这似乎比我正在做的要复杂得多。我试图实现do.call方法,如提到here但我无法使其工作。如果真的不可能在没有深入研究功能的情况下做到这一点,我将找到一种围绕它进行编程的方法。但对我而言,感觉就像是在努力做一些有意义的事情。所以我可能更有可能做错事,而不是做一些不可能的事情。

1 个答案:

答案 0 :(得分:1)

这是anova.cca(...,by =&#34; axis&#34;)中的一个范围问题,它应该在更新公式时从几个不同的环境中找到项目(我不会进入技术细节)。你真的不能嵌入这个函数来分析轴的意义。这是一个已知的问题。我们已经在素食主义者的开发版中解决了这个问题。 https://github.com/vegandevs/vegan中重新设计的功能似乎适用于此示例。所有圣职和重要功能都在那里彻底改变,它们还没有完全完成。我们计划在2017年最后一个季度以2.5-0的素食方式发布它们,但它们尚未完成。

问题是anova.cca(..., by = "axis")必须找到它在函数中构建的项目,此外它还可以找到构建原始模型时可用的项目,但是它找不到您在函数中生成的项目嵌入功能。您必须通过使嵌入函数将其对象写入可以找到的对象来避免这种情况。最简单(但很脏)的解决方案是使用<<-将它们写入父环境。以下版本的函数添加了此<<-,似乎在纯素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)