2014-11-21 27 views
5

看起來%>%magrittr封裝不適用於功能load()。這是我最小的例子來重現我的問題。magrittr封裝中的管道不能用於功能加載()

## 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()。感謝您的任何建議。

+8

在示例代碼中包含'rm(list = ls())'通常不是好的形式,所以人們不會無意中銷燬他們的工作數據。 – thelatemail 2014-11-21 04:13:38

+3

@thelatemail感謝您的編輯。我通常會打開一個新會話來測試來自stackoverflow和其他人的示例代碼。 – Bangyou 2014-11-21 04:58:56

+0

這可能很聰明。 :-) – thelatemail 2014-11-21 04:59:29

回答

5

load()中的envir參數需要指定爲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()

有解決此兩種解決方案。要麼明確指向globalenv(),要麼使用parent.frame(3)步進3步向全球環境鏈。


注:有此一issue reported on GitHub。不知道該決議是什麼,或者如果有。這個問題剛剛在9月份報道。

非常感謝@Andrie爲了改進這個解釋。

+0

感謝您的建議。它正在爲全球環境工作,但仍然需要在調用函數中的「加載」時修復它。 – Bangyou 2014-11-21 05:09:19

+0

感謝您的建議。對於我的挖掘,管道真正評估功能負載並將所有變量加載到新環境中。但是返回的值是不可見的(visible = FALSE),所以pipe返回一個不可見的結果(不可見(result [[「value」]]))。不知道如何解決它。 – Bangyou 2014-11-21 05:50:38

+0

請參閱github的評論:https://github.com/smbache/magrittr/issues/38 – Bangyou 2014-11-21 05:56:22

相關問題