首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows 10环境下RStudio的环境问题

Windows 10环境下RStudio的环境问题
EN

Stack Overflow用户
提问于 2018-10-01 17:27:00
回答 1查看 177关注 0票数 0

多年来,我一直在密集地使用R,并认为自己在这方面相当流利(尽管无可否认,我仍然在努力处理代码中优雅的概念)。尽管如此,我现在遇到了以前从未遇到过的问题,我认为这可能与我的新机器或Windows 10本身有关。为了解释一下,我最近的工作为我提供了一台功能更强大的计算机,但那是运行Windows 10的,而不是我以前拥有的Windows 7专业版。

尽我所能,我仍然可以使用.GlobalEnv中的变量(按照函数逐行运行),没有问题,但是如果我试图在我编写的函数中运行一个进程,我在函数中创建的一些变量就会被随机遗忘,它会给我提供(例如)错误“eval中的错误(解析(text=i)):对象'i‘inside”,即使'i’是由前面一行中的"for (i in vars)“编码的。

更重要的是,我已经测试了一些常规使用这些进程的旧函数,它们在这台机器上抛出了错误,而这些错误在我以前的机器上是不存在的。

这是Windows 10的兼容性问题吗?它是否与操作系统如何在线程间拆分R进程有关?有人知道吗?

我将提供抛出错误的代码片段。如果其他人能复制它,并告诉我他们认为错误在哪里,我将非常感激。

谢谢!

代码语言:javascript
复制
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)
}

此外,这里还有一些用上述函数再现错误的虚拟代码。

代码语言:javascript
复制
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"))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-01 19:20:12

我不能说为什么在没有更多工作的情况下问题就会发生,但是几乎总是有一个更健壮的解决方案-- eval(parse(...))。在本例中,reformulate()似乎有效(我从下一行删除了明显多余的which(),但这与此无关):

代码语言:javascript
复制
ado <- adonis2(reformulate(i,response="dist"),
               data=meta[row.names(dist)%in%meta$SampleID,])

我得到了NA/NaN结果,但我假设这是因为这里的示例数据集非常简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52596028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档