2014-11-21 5 views
5

Sembra %>% nel pacchetto magrittr non funziona per la funzione load(). Questo è il mio esempio minimo per riprodurre la mia domanda.Il pacchetto pipe in magrittr non funziona per il caricamento della funzione()

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

Non capisco il motivo per cui il tubo non funziona per load(). Grazie per eventuali suggerimenti.

+8

In genere non è consigliabile includere 'rm (list = ls())' nel codice di esempio, in modo che le persone non distruggano i loro dati di lavoro involontariamente. – thelatemail

+3

@thelatemail Grazie per il tuo editing. Normalmente apro una nuova sessione per testare i codici di esempio da StackOverflow e altri. – Bangyou

+0

probabilmente è intelligente. :-) – thelatemail

risposta

5

L'argomento envir in load() deve essere specificato come globalenv() o 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" 

le seguenti opere anche:

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

cercherò di spiegare perché. Quando chiami load() da qualsiasi ambiente, la funzione carica i nuovi oggetti nell'ambiente padre.

Ora, l'ambiente globale globalenv() è lo spazio di lavoro R. Quindi, se chiami il carico dall'ambiente globale (ad esempio lo spazio di lavoro) tutto funziona come ti aspetti. Visualizza questo:

  • Ambiente globale
    • load()

Tuttavia, se si chiama load() dall'interno di una funzione, allora hai inserito un ambiente tra il carico e il globale ambiente. Visualizza questo:

  • Ambiente globale
    • funzione
      • load()

Questo è esattamente ciò che accade quando si mette %>% nel mix:

  • Ambiente globale
    • %>%
      • load()

Ci sono due soluzioni per risolvere questo. Puntare esplicitamente a globalenv() o camminare 3 passaggi sulla catena per l'ambiente globale utilizzando parent.frame(3).


Nota: C'era una issue reported on GitHub per questo. Non sei sicuro di quale sia stata la risoluzione o se ce n'è ancora una. Il problema è stato appena segnalato a settembre.

Mille grazie a @Andrie per aver migliorato questa spiegazione.

+0

Grazie per il tuo suggerimento. Funziona per l'ambiente globale, ma ha ancora bisogno di risolverlo quando si chiama "load" in una funzione. – Bangyou

+0

Grazie per il tuo suggerimento. Per il mio scavare, pipe valuta veramente la funzione load e carica tutte le variabili nel nuovo ambiente. Ma i valori restituiti sono invisibili (visible = FALSE), quindi pipe restituisce un risultato invisibile (invisibile (risultato [["valore"]])). Non sei sicuro di come aggiustarlo. – Bangyou

+0

Vedere i dettagli nel commento di github: https://github.com/smbache/magrittr/issues/38 – Bangyou

Problemi correlati