多年来,我一直在大量使用R,并认为自己在R方面相当流利(尽管公认地仍在努力应对代码中的优雅概念)。话虽这么说,但我现在遇到了我以前从未遇到过的问题,我认为这可能与我的新计算机或Windows 10本身有关。为了说明,我的工作最近为我提供了一台功能更强大的计算机,但是它运行的是Windows 10,而不是以前拥有的Windows 7 Professional。
尽我所能估计,我仍然可以在.GlobalEnv中使用变量(逐行操作),没有问题,但是如果我尝试在已编写的函数中运行进程,则某些变量函数内部的创建会被随机遗忘,并且为我提供了(例如)错误“错误eval(parse(text = i)):找不到对象'i'”,即使'i'的编码为“ for(我在vars)”。
最重要的是,我已经测试了我的一些常规函数,这些函数会常规使用这些进程,并且它们在本机上引发了我以前的函数中不存在的错误。
这是Windows 10的兼容性问题吗?可能与OS如何在线程之间拆分R进程有关吗?有人知道吗?
我将提供引发错误的代码段。如果其他人可以复制它,并告诉我他们认为该错误在哪里,我将非常感激。
谢谢!
adonis.tbl <- function(dist, meta, vars){
# where dist is a distance matrix of samples with distances based on
# community composition, meta is a table with metadata,
# and vars is a list of variables in meta, given as character strings
# row.names in dist must match the corresponding sample names in meta,
# named 'SampleID' in the metadata table
require(vegan)
out <- data.frame()
for (i in vars){
ado <- adonis2(dist ~ eval(parse(text=i)),
data=meta[which(row.names(dist)%in%meta$SampleID),])
out1 <- data.frame(R2=ado$R2[1], p=ado$`Pr(>F)`[1])
out <- rbind(out, out1)
}
row.names(out) <- vars
return(out)
}
此外,这是一些虚拟代码,可通过上述功能重现错误。
dat <- matrix(runif(150, 1, 1000), 15, 10, dimnames=list(letters[1:15], LETTERS[6:15]))
tree <- ape::rtree(10, tip.label=LETTERS[6:15])
dist <- GUniFrac::GUniFrac(dat, tree, 0)
bdist <- dist$unifracs[,,2]
meta <- data.frame(SampleID=letters[1:15],
var1=round(runif(15, 1, 5000)),
var2=round(runif(15, 1, 1000)),
var3=round(runif(15, 1, 500)))
test <- adonis.tbl(bdist, meta, c("var1", "var2", "var3"))
答案 0 :(得分:0)
我不能说为什么,如果没有更多的工作,问题就会发生,但是几乎总是有一个比eval(parse(...))
更强大的解决方案。在这种情况下,reformulate()
似乎可以工作(我从下一行中删除了似乎很多余的which()
,但这无关紧要):
ado <- adonis2(reformulate(i,response="dist"),
data=meta[row.names(dist)%in%meta$SampleID,])
我得到NA
/ NaN
的结果,但是我认为那是因为此处的样本数据集是微不足道的。