8

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

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

4

1 回答 1

7

in 中的envir参数load()需要指定为globalenv() or 或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"

以下也有效:

tempdir() %>% file.path("tmp.RData") %>% load(envir = parent.frame(3))

我将尝试解释原因。当您load()从任何环境调用时,该函数会在父环境中加载新对象。

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

  • 全球环境
    • load()

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

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

这正是你%>%加入混合时发生的情况:

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

有两种解决方案可以解决此问题。使用. globalenv()_parent.frame(3)


注意:在 GitHub 上报告了 一个问题。不确定决议是什么,或者是否还有一个。这个问题刚刚在 9 月份被报道。

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

于 2014-11-21T05:06:09.587 回答