2012-05-18 13 views
15

Mi piacerebbe capire la logica R utilizzata quando si passano gli argomenti alle funzioni, si creano copie di variabili, ecc. Rispetto all'utilizzo della memoria. Quando crea effettivamente una copia della variabile rispetto al solo passaggio di un riferimento a quella variabile? In particolare, le situazioni mi incuriosisce sono:R, copie profonde o superficiali, passaggio per riferimento

f <- function(x) {x+1} 
a <- 1 
f(a) 

È a essere passato alla lettera o è un riferimento ad un essere passato?

x <- 1 
y <- x 

Riferimento della copia? Quando non è questo il caso?

Se qualcuno potesse spiegarmelo, apprezzerei molto.

+3

Si potrebbe trovare [questo] (http://cran.at.r-project.org/doc/manuals/R -lang.html # Valutazione) sezione della definizione del linguaggio R utile. – joran

+2

Questo documento di Morandat e colleghi ha una discussione interessante e critica sulla valutazione lenta degli argomenti in R: http://www.cs.purdue.edu/homes/jv/pubs/ecoop12.pdf – jthetzel

+4

Uso di 'tracemem' in un modo appropriato la R compilata può essere utile per l'esplorazione, così come '.Internal (inspect (x))' con una comprensione del campo 'NAM'ED; il mio mantra generale è 'copy-on-change' quindi ad esempio il tuo 'y <- x' non innesca una copia (ancora) perché non c'è stato alcun cambiamento nell'originale, la memoria puntata da' x' (e ' y') è 'NAMED' tale che la modifica di uno dei due attiverà una copia. –

risposta

12

Quando passa le variabili, è sempre per copia anziché per riferimento. A volte, tuttavia, non otterrai una copia finché non si verifica effettivamente un incarico. La vera descrizione del processo è pass-by-promise. Date un'occhiata alla documentazione

?force 
?delayedAssign 

Un'implicazione pratica è che è molto difficile se non impossibile evitare che necessitano di almeno il doppio di RAM come gli oggetti nominalmente occupano. La modifica di un oggetto di grandi dimensioni richiede in genere una copia temporanea.

aggiornamento: 2015: ho fatto (e fatto) d'accordo con Matt Dowle che il suo pacchetto data.table fornisce un percorso alternativo all'assegnazione che evita il problema di duplicazione della copia. Se quello era l'aggiornamento richiesto, allora non l'ho capito al momento in cui è stato fatto il suggerimento.

C'è stata una recente modifica in R 3.2.1 nelle regole di valutazione per apply e Reduce. E 'stato così-annunciato con riferimento alla notizia qui: Returning anonymous functions from lapply - what is going wrong?

E il interesting paper cited by jhetzel in the comments is now here:

+8

Immettere ['data.table'] (http://datatable.r-forge.r-project.org/). Vedi '? Copia' nel pacchetto. L'assegnazione per riferimento è possibile con l'operatore ': =', si veda '?": = "' E la serie di funzioni 'set *'. Invece di avere bisogno di spazio per 2-3 copie dell'intero oggetto, miriamo a richiedere solo una colonna di memoria funzionante o inferiore. –

Problemi correlati