2017-06-20 133 views
0

我想要在同一数据集的子集上执行相同的rda分析序列(拟合模型,测试模型的显着性,轴和术语,绘制数据) 。所以我写了一个函数。现在的问题是,当我想测试轴时,调用anova.cca函数在函数内不能正常工作。它不能找到Y.sub数据集anova.cca在用户定义的函数内找不到对象

错误的eval(表达式,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,但这似乎比我所做的要复杂得多。我试图执行doscall方法,正如here提到的,但我无法实现它的工作。如果真的不可能在没有深入研究函数的情况下做到这一点,我会在周围找到一种编程方式。但对我而言,这感觉就像我正在努力做一些总体上有意义的事情。因此,我做错事的可能性比我做不可能事情的可能性更大。

+0

我在原来的问题打字的时候做了一个愚蠢的错误工作。我最初把'rda.subsetfunc(RV = dune,Y = Y.sub)'这不起作用的原因很明显。感谢@ chi-pak让我认识到 – Nightingale

+0

这不是问题,因为RV.sub是X矩阵,而不是Y的列。这是rda函数的工作方式。如果我省略了anova函数,我的函数可以正常工作。这是造成麻烦的原因之一。 我真的很感谢你的帮助! – Nightingale

+0

来自rda的帮助页面。 (沙丘) data(dune.env) dune.Manure < - rda(dune〜Manure, – Nightingale

回答

1

这是anova.cca(...,by =“axis”)中的一个范围问题,它应该在更新公式时从几个不同的环境中找到项目(我不会涉及技术细节)。你真的不能嵌入函数来分析轴的意义。这是一个已知的问题。我们已经解决了素食的开发版本。在这个例子中,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) 
+0

哦,哇,这是一个整洁(但稍微危险)的把戏!谢谢 – Nightingale

相关问题