Windows 10中RStudio的环境问题

时间:2018-10-01 17:27:00

标签: r windows-10 environment

多年来,我一直在大量使用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"))

1 个答案:

答案 0 :(得分:0)

我不能说为什么,如果没有更多的工作,问题就会发生,但是几乎总是有一个比eval(parse(...))更强大的解决方案。在这种情况下,reformulate()似乎可以工作(我从下一行中删除了似乎很多余的which(),但这无关紧要):

ado <- adonis2(reformulate(i,response="dist"),
               data=meta[row.names(dist)%in%meta$SampleID,])

我得到NA / NaN的结果,但是我认为那是因为此处的样本数据集是微不足道的。