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()
。谢谢你的任何建议。
答案 0 :(得分:6)
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"
以下也有效:
tempdir() %>% file.path("tmp.RData") %>% load(envir = parent.frame(3))
我会试着解释原因。当您从任何环境调用load()
时,该函数会在父环境中加载新对象。
现在,全局环境globalenv()
是您的R工作区。因此,如果从全局环境(即工作空间)调用load,一切都按预期工作。想象一下:
load()
但是,如果从函数内部调用load()
,则会在load和全局环境之间插入一个环境。想象一下:
load()
当你将%>%
放入混音时,就会发生这种情况:
%>%
load()
有两种解决方案可以解决这个问题。使用globalenv()
明确指向parent.frame(3)
或向上走3步到全球环境。
注意:此版本有issue reported on GitHub。不确定分辨率是什么,或者是否还有分辨率。这个问题刚刚在9月报道过。
非常感谢@Andrie改进了这个解释。