Windows 10 中 RStudio 的环境问题
Environment problem with RStudio in Windows 10
多年来,我一直在大量使用 R,并且认为自己相当熟练(尽管不可否认,我仍在努力解决代码优雅的概念)。话虽如此,我现在遇到了以前从未有过的问题,我认为这可能与我的新机器或 Windows 10 本身有关。解释一下,我的工作最近为我提供了一台功能更强大的计算机,但那是 运行ning Windows 10,而不是我以前拥有的 Windows 7 Professional。
据我所知,我仍然可以在 .GlobalEnv 中使用变量(逐行跟随函数)而不会出现问题,但是如果我尝试 运行 一个函数内部的进程,我有写入时,我在函数内部创建的一些变量被随机遗忘,它为我提供了(例如)错误 "Error in eval(parse(text=i)): object 'i' not found",即使 'i' 在上一行中由 "for (i in 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"))
我不能说 为什么 没有更多的工作就出现了这个问题,但几乎总是有比 eval(parse(...))
更强大的解决方案。在这种情况下 reformulate()
似乎有效(我从下一行中删除了明显多余的 which()
,但这无关紧要):
ado <- adonis2(reformulate(i,response="dist"),
data=meta[row.names(dist)%in%meta$SampleID,])
我得到 NA
/NaN
结果,但我认为这是因为这里的示例数据集很简单。
多年来,我一直在大量使用 R,并且认为自己相当熟练(尽管不可否认,我仍在努力解决代码优雅的概念)。话虽如此,我现在遇到了以前从未有过的问题,我认为这可能与我的新机器或 Windows 10 本身有关。解释一下,我的工作最近为我提供了一台功能更强大的计算机,但那是 运行ning Windows 10,而不是我以前拥有的 Windows 7 Professional。
据我所知,我仍然可以在 .GlobalEnv 中使用变量(逐行跟随函数)而不会出现问题,但是如果我尝试 运行 一个函数内部的进程,我有写入时,我在函数内部创建的一些变量被随机遗忘,它为我提供了(例如)错误 "Error in eval(parse(text=i)): object 'i' not found",即使 'i' 在上一行中由 "for (i in 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"))
我不能说 为什么 没有更多的工作就出现了这个问题,但几乎总是有比 eval(parse(...))
更强大的解决方案。在这种情况下 reformulate()
似乎有效(我从下一行中删除了明显多余的 which()
,但这无关紧要):
ado <- adonis2(reformulate(i,response="dist"),
data=meta[row.names(dist)%in%meta$SampleID,])
我得到 NA
/NaN
结果,但我认为这是因为这里的示例数据集很简单。