【问题标题】:anova.cca cannot find object within user defined functionanova.cca 在用户定义的函数中找不到对象
【发布时间】: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 &lt;- rda(dune ~ Manure, dune.env) 所以 RV.sub 不在 Y.sub 中是正确的。
  • 是的,你是对的,但我仍然认为这是问题的一部分。看看dune.Manure。它显示了这一点:rda(formula = dune ~ Manure, data = dune.env)。由于某种原因,此dune.Manureparent 环境中查找变量...如果您在parent 中声明RV.sub &lt;- dune,则该函数不会返回错误。
  • 这是anova.cca(..., by="axis") 中的一个范围界定问题,它在更新公式时应该会从几个不同的环境中找到项目。嵌入功能真的可能会失败。但是,github.com/vegandevs/vegan 中重新设计的函数似乎适用于此示例。

标签: r function object vegan


【解决方案1】:

这是 anova.cca(..., by="axis") 中的一个范围问题,它在更新公式时应该会从几个不同的环境中找到项目(我不会详细介绍技术细节)。你真的不能嵌入函数来分析轴的重要性。这是一个已知的问题。我们已经在 vegan 的开发版本中解决了这个问题。 https://github.com/vegandevs/vegan 中重新设计的函数似乎适用于这个示例。那里所有的戒律和意义功能都发生了根本性的变化,它们还没有完全完成。我们计划在 2017 年最后一个季度以纯素 2.5-0 的形式发布它们,但它们还没有完成。

问题是anova.cca(..., by = "axis") 必须找到它在函数中构建的项目,此外它可以找到构建原始模型时可用的项目,但它无法找到您在嵌入的函数中生成的项目功能。您必须通过使嵌入函数将其对象写入可以找到这些对象的位置来规避这一点。最简单(但很脏)的解决方案是使用&lt;&lt;- 将它们写入父环境。您的函数的以下版本添加了这个 &lt;&lt;- 并且似乎在 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)

【讨论】:

  • 哇哦,这是一个巧妙(但有点危险)的把戏!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
相关资源
最近更新 更多