magrittr包中的管道不适用于功能负载()

Ban*_*you 8 r magrittr

它似乎%>%magrittr包中不起作用load().这是我重现我的问题的最小例子.

## Create two example variables and save to tempdir()
a <- 1
b <- 1

save(list = ls(), file = file.path(tempdir(), 'tmp.RData'))

## Remove all variables and load into global environment
# rm(list = ls())

load(file.path(tempdir(), 'tmp.RData'))
ls()
# [1] "a" "b"

# Write the same code with pipe "%>%", but not variable is loaded
# rm(list =ls())
library(magrittr)

tempdir() %>% file.path('tmp.RData') %>% load
ls()
# character(0)
Run Code Online (Sandbox Code Playgroud)

我不明白为什么管道不起作用load().谢谢你的任何建议.

Ric*_*ven 7

需要将envir参数load()指定为globalenv() 或者parent.frame(3).

# in a fresh R session ...
a <- 1
b <- 1
save(list = ls(), file = file.path(tempdir(), 'tmp.RData'))

# in another fresh session ...
ls()
# character(0)
tempdir() %>% file.path("tmp.RData") %>% load(envir = globalenv())
ls()
# [1] "a" "b"
Run Code Online (Sandbox Code Playgroud)

以下也有效:

tempdir() %>% file.path("tmp.RData") %>% load(envir = parent.frame(3))
Run Code Online (Sandbox Code Playgroud)

我会试着解释原因.load()从任何环境调用时,该函数都会在父环境中加载新对象.

现在,全局环境globalenv()就是您的R工作区.因此,如果从全局环境(即工作空间)调用load,一切都按预期工作.想象一下:

  • 全球环境
    • load()

但是,如果load()从函数内部调用,则在load和全局环境之间插入了一个环境.想象一下:

  • 全球环境
    • 功能
      • load()

这正是你投入%>%混合时会发生的事情:

  • 全球环境
    • %>%
      • load()

有两种解决方案可以解决这个问题.使用明确指向globalenv()链路或向上走3步到全局环境parent.frame(3).


注意:GitHub上报告了 一个问题.不确定分辨率是什么,或者是否还有分辨率.这个问题刚刚在九月报道.

非常感谢@Andrie改进了这个解释.