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 结果,但我认为这是因为这里的示例数据集很简单。