2011-10-16 6 views
13

Questa potrebbe essere una domanda molto semplice, ma non ho ancora trovato una risposta convincente. Quando eseguo uno script R all'interno dell'ambiente R, posso fare sia source(foo.R) o system("Rscript foo.R"). C'è qualche differenza tra i due approcci e, in caso affermativo, come si confrontano i due approcci?Rscript vs. source: quali sono le differenze chiave?

risposta

14

Sono fondamentalmente diversi nei loro effetti.

  • source("foo.R") dice il vostro attuale processo di R per prendere il suo input da "foo.R".

  • system("Rscript foo.R") utilizza un comando del sistema operativo per avviare un processo R separato, all'interno del quale vengono valutati i contenuti di "foo.R".

La chiamata Rscript non influenzerà direttamente la sessione corrente R a tutti, tranne che sarà di default stampare l'output di quell'altra sessione di R sulla console corrente. (È possibile disabilitarlo nella chiamata system() impostando show.output.on.console=FALSE).

2

Penso che source(foo.R) includa il codice sorgente di tale file (foo.R) nell'ambiente corrente. Se si definisce una variabile all'interno di foo.R, diciamo x <- 5, e nel progetto corrente si definisce in anticipo x <- 6, x diventa 5.

system("Rscript foo.R") esegue il programma Rscript con l'argomento foo.R, quindi l'ambiente corrente non è interessato.

+0

otterrebbe gli stessi risultati di 'sys.source'? Capisco che usare 'Rscript' sarebbe molto utile quando si esegue un set indipendente di script. – Ramnath

+0

'sys.source()' è un cugino stretto di 'source()' --- la pagina di aiuto 'source' chiama' sys.source' una "versione semplificata". Mi sembra probabile che 'sys.source' sia stato progettato principalmente per il suo uso da' library() '. –

+0

grazie. tutto ha senso ora. – Ramnath

2

In risposta al commento di @ Ramnath: sys.source("foo") non corrisponde a Rscript foo. Ad esempio, è possibile effettuare le seguenti operazioni con sys.source:

e <- new.env() 
sys.source("foo", e) # foo creates a bunch of objects in environment e 
z <- with(e, { 
    # do stuff with e.... 
}) 
rm(e) 

Si potrebbe fare questo se si sta creando diversi oggetti intermedi, che poi fare cose su e restituire un risultato finale. Non vuoi mantenere gli oggetti intermedi, quindi metterli nel loro ambiente temporaneo è un modo semplice per rimuoverli in una volta sola.

Problemi correlati