多年来,我一直在密集地使用R,并认为自己在这方面相当流利(尽管无可否认,我仍然在努力处理代码中优雅的概念)。尽管如此,我现在遇到了以前从未遇到过的问题,我认为这可能与我的新机器或Windows 10本身有关。为了解释一下,我最近的工作为我提供了一台功能更强大的计算机,但那是运行Windows 10的,而不是我以前拥有的Windows 7专业版。
尽我所能,我仍然可以使用.GlobalEnv中的变量(按照函数逐行运行),没有问题,但是如果我试图在我编写的函数中运行一个进程,我在函数中创建的一些变量就会被随机遗忘,它会给我提供(例如)错误“eval中的错误(解析(text=i)):对象'i‘inside”,即使'i’是由前面一行中的"for (i in vars)“编码的。
更重要的是,我已经测试了一些常规使用这些进程的旧函数,它们在这台机器上抛出了错误,而这些错误在我以前的机器上是不存在的。
这是Windows 10的兼容性问题吗?它是否与操作系统如何在线程间拆分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"))发布于 2018-10-01 19:20:12
我不能说为什么在没有更多工作的情况下问题就会发生,但是几乎总是有一个更健壮的解决方案-- eval(parse(...))。在本例中,reformulate()似乎有效(我从下一行删除了明显多余的which(),但这与此无关):
ado <- adonis2(reformulate(i,response="dist"),
data=meta[row.names(dist)%in%meta$SampleID,])我得到了NA/NaN结果,但我假设这是因为这里的示例数据集非常简单。
https://stackoverflow.com/questions/52596028
复制相似问题