当前位置: 首页 > 知识库问答 >
问题:

R管道、mget和环境

邢法
2023-03-14

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

这是可行的:

results_all <- rbindlist(mget(ls(pattern = "part_", )))

我大概是从内存中的list Data.Tables和按行组合(rbind)中学到这种方法的,而且知道如何确实做到这一点是很有帮助的。

为了可读性,我通常更喜欢使用magrittr管道(或与data.table链接),对于这样的项目尤其如此,因为我使用dplyr查询数据库。但此代码会导致一个错误:

results_all <- ls(pattern = "part_", ) %>% 
 mget() %>%
 rbindlist()
results_all <- ls(pattern = "part_", ) %>% 
 mget(inherits = TRUE) %>%
 rbindlist()
results_all <- ls(pattern = "part_", ) %>% 
 mget(envir = .GlobalEnv) %>%
 rbindlist()

编辑:添加可复制示例

根据对可复制答案的请求,使用这三个data.tables(data.frames或tibbles的行为相同)运行上面的代码就可以做到这一点。

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)) 

共有1个答案

涂羽
2023-03-14

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

此新函数调用的调用环境是%>%的函数环境,而不是LHS函数的调用环境或全局环境。在示例中,.globalenvlhs函数的调用环境恰好是同一环境,并且该环境是%>%函数环境的父环境,这就是为什么继承=true或将环境设置为.globalenv对您有效的原因。

 类似资料:
  • MGET key [key ...] 返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。 可用版本: >= 1.0.0 时间复杂度: O(N) , N 为给定 key 的数量。 返回值: 一个包含所有给定 key 的值的列表。 redis> SET redis redis.com OK re

  • 我对Bitbucket管道(Beta版)和Docker很陌生,以前没有配置项集成的经验 我遵循了这个问题,但是对于初学者没有明确的描述 我正在尝试使用docker容器为Android项目在Bitbucket管道中设置持续集成(CI) 我遵循的步骤 步骤1.已安装Docker软件工具。已成功安装。 第二步。已成功创建虚拟机 错误出现: Docker-机器详细信息 码头机环境

  • MGET key [key ...] 返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。 可用版本: >= 1.0.0 时间复杂度: O(N) , N 为给定 key 的数量。 返回值: 一个包含所有给定 key 的值的列表。 redis> SET redis redis.com OK re

  • 问题内容: 是否有任何环境变量可用于获取Jenkins管道标题? 我知道我们可以使用它来获得自由职业的头衔,但是有什么可以用来获取管道名称的东西吗? 问题答案: 您可以使用相同的名称(例如或)从groovy访问相同的环境变量。 从文档中: 可以从Groovy代码中以env.VARNAME或仅以VARNAME的形式访问环境变量。您也可以写入这些属性(仅使用env。前缀): 这些定义也将在构建期间或构

  • Azure发布管道可以使用环境功能吗?我一直在寻找,但所有使用环境的示例都是YAML和管道部署任务。

  • 我有一个azure构建管道和发布管道。我在发布构建工件中面临问题。在构建管道中,发布构建工件被正确地创建在默认的“drop”目录中。 当我在发布管道中下载该工件时,发布文件正在服务抛出错误的中下载 您没有查看此目录或页面的权限。 这意味着我的发布工件没有在“home/wwwroot”目录中下载。 构建管道 释放管道 我错过了什么?