2014-11-21 8 views
5

Es scheint %>% in der magrit Paket funktioniert nicht für die Funktion load(). Dies ist mein minimales Beispiel, um meine Frage zu reproduzieren.Rohr in magrittr-Paket funktioniert nicht für Funktion laden()

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

Ich verstehe nicht, warum das Rohr nicht für load() arbeitet. Danke für Anregungen.

+8

Es ist normalerweise keine gute Form, 'rm (list = ls())' in den Beispielcode aufzunehmen, damit Benutzer ihre Arbeitsdaten nicht unbeabsichtigt zerstören. – thelatemail

+3

@thelatemail Danke für Ihre Bearbeitung. Ich öffne normalerweise eine neue Sitzung, um Beispielcodes von stackoverflow und von anderen zu prüfen. – Bangyou

+0

das ist wahrscheinlich schlau. :-) – thelatemail

Antwort

5

Das envir Argument in load() muss entweder globalenv() oder parent.frame(3) angegeben werden.

# 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" 

Im Folgenden auch funktioniert:

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

Ich werde versuchen zu erklären, warum. Wenn Sie load() aus einer beliebigen Umgebung aufrufen, lädt die Funktion die neuen Objekte in der übergeordneten Umgebung.

Jetzt ist die globale Umgebung globalenv() Ihr R-Arbeitsbereich. Wenn Sie also Last von der globalen Umgebung (d. H. Dem Arbeitsbereich) aufrufen, funktioniert alles wie erwartet. Visualisieren Sie diese:

  • Globale Umwelt
    • load()

Wenn Sie jedoch load() aus dem Inneren einer Funktion aufrufen, dann haben Sie eine Umgebung, in zwischen Last eingesetzt und die globale Umgebung. Visualisieren Sie diese:

  • Globale Umweltprobleme
    • Funktion
      • load()

Das ist genau das, was passiert, wenn man %>% in die Mischung setzen:

  • Globale Umwelt
    • %>%
      • load()

Es gibt zwei Lösungen dies für die Lösung. Zeigen Sie entweder explizit auf globalenv() oder gehen Sie 3 Schritte die Kette hinauf zur globalen Umgebung, indem Sie parent.frame(3) verwenden.


Hinweis: Es gab eine issue reported on GitHub dafür. Nicht sicher, was die Auflösung war oder ob es noch eine gibt. Das Problem wurde erst im September gemeldet.

Vielen Dank an @Andrie für die Verbesserung dieser Erklärung.

+0

Danke für deinen Vorschlag. Es funktioniert für eine globale Umgebung, muss aber beim Aufruf von "load" in einer Funktion behoben werden. – Bangyou

+0

Danke für Ihren Vorschlag. Für meine Suche wertet Pipe wirklich die Funktionslast aus und lädt alle Variablen in die neue Umgebung. Die zurückgegebenen Werte sind jedoch unsichtbar (sichtbar = FALSE), so dass pipe ein unsichtbares Ergebnis zurückgibt (unsichtbar (result [["value"]])). Ich bin mir nicht sicher, wie ich es beheben kann. – Bangyou

+0

Siehe Detail im Kommentar von GitHub: https://github.com/smbache/magrittr/issues/38 – Bangyou

Verwandte Themen