首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R管道、mget和环境

R管道、mget和环境
EN

Stack Overflow用户
提问于 2020-10-06 18:32:44
回答 1查看 335关注 0票数 2

我发这篇文章是希望有人能解释一下这里的行为。也许这可以为其他人节省一些时间来追踪如何修复类似的错误。

答案很可能在哈德利·韦翰和莱昂内尔·亨利的小说集的某个地方。然而,像我这样的人要花几周的时间才能把这些点点滴滴联系起来。

我正在从一个远程数据库运行许多查询,然后将它们合并到一个data.table中。我在每个查询结果的名称中添加了"part_“前缀,并将ls()mget()与data.table的rbindlist()组合在一起。

这样做是可行的:

代码语言:javascript
复制
results_all <- rbindlist(mget(ls(pattern = "part_", )))

我学习了这种方法,可能是从在内存中列出data.tables并按行组合(rbind)那里学到的,知道如何确定是一件很有帮助的事情。

为了提高可读性,我通常更喜欢使用magrittr管道(或者使用data.table链接),尤其是这样的项目,因为我使用dplyr查询数据库。然而,这段代码会导致一个错误:

代码语言:javascript
复制
results_all <- ls(pattern = "part_", ) %>% 
 mget() %>%
 rbindlist()

错误读取Error: value for ‘part_a’ not found,其中part_a是ls()返回的字符向量中的第一个对象名。

在搜索错误消息时,我看到了讨论在这个data.table杂志上。通过阅读,我尝试在mget()中设置"inherits = TRUE“,如下所示:

代码语言:javascript
复制
results_all <- ls(pattern = "part_", ) %>% 
 mget(inherits = TRUE) %>%
 rbindlist()

而且这很管用。因此,当将ls()的结果传输到mget()时,会发生错误。考虑到在mget()中嵌套ls()是可行的,我的猜测是它与管道和“环境的包围框架”有关。

在写这篇文章时,我偶然发现了使用mget()将data.table与rbindlist()连接时出现意外错误消息。从那里的讨论,我发现这也是可行的。

代码语言:javascript
复制
results_all <- ls(pattern = "part_", ) %>% 
 mget(envir = .GlobalEnv) %>%
 rbindlist()

再一次,我希望有人能解释一下正在发生的事情,希望能更多地了解在R中环境是如何工作的。

编辑:添加可重复的示例

根据对可重复答案的请求,使用这三个data.tables运行上面的代码(data.frames或tibbles将表现相同)应该这样做。

代码语言:javascript
复制
part_a <- data.table(col1 = 1:10, col2 = sample(letters, 10))

part_b <- data.table(col1 = 11:20, col2 = sample(letters, 10))
  
part_c <- data.table(col1 = 21:30, col2 = sample(letters, 10)) 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-06 18:48:28

管道操作符的rhs参数(在您的示例中,表达式mget())从未被解释器计算为函数调用。管道操作符是一个infix函数,它执行其第二个参数(rhs)的非标准计算。管道函数使用RHS表达式作为一种“模板”组成并执行新的函数调用。

这个新函数调用的调用环境是%>%的函数环境,而不是lhs函数的调用环境或全局环境。在您的示例中,.GlobalEnvlhs函数的调用环境恰好是相同的环境,并且该环境是%>%函数环境的父环境,这就是为什么inherits = TRUE或将环境设置为.GlobalEnv的原因。

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

https://stackoverflow.com/questions/64231839

复制
相关文章

相似问题

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