R ha una semantica pass-by-value, che riduce al minimo gli effetti collaterali accidentali (una buona cosa). Tuttavia, quando il codice è organizzato in molte funzioni/metodi per la riusabilità/leggibilità/manutenibilità e quando quel codice ha bisogno di manipolare grandi strutture di dati attraverso, ad esempio, grandi frame di dati, attraverso una serie di trasformazioni/operazioni, la semantica pass-by-value conduce a un sacco di copia di dati in giro e molto heap thrashing (una cosa negativa). Ad esempio, un frame di dati che richiede 50 Mb sull'heap che viene passato come parametro di funzione verrà copiato almeno lo stesso numero di volte della profondità della chiamata della funzione e la dimensione dell'heap nella parte inferiore dello stack di chiamate sarà N * 50Mb. Se le funzioni restituiscono un frame di dati trasformato/modificato dal deep nella catena di chiamate, la copia sale di un altro N.R: il passaggio di un frame di dati per riferimento
La domanda SO What is the best way to avoid passing a data frame around? tocca questo argomento ma è formulata in modo tale da evitare di chiedere direttamente il pass-by - domanda di riferimento e la risposta vincente in pratica dice "sì, il valore per il passaggio è come funziona R". Questo in realtà non è accurato al 100%. Gli ambienti R consentono la semantica pass-by-reference e framework OO come proto utilizzano questa funzionalità in modo estensivo. Ad esempio, quando un oggetto proto viene passato come argomento di funzione, mentre il suo "wrapper magico" viene passato per valore, allo sviluppatore R la semantica è pass-by-reference.
Sembra che passare un grande data frame per riferimento sarebbe un problema comune e mi chiedo come gli altri si siano avvicinati e se ci siano librerie che lo abilitino. Nella mia ricerca non ne ho scoperto uno.
Se non è disponibile, il mio approccio sarebbe quello di creare un oggetto proto che avvolge un frame di dati. Apprezzerei i puntatori sullo zucchero sintattico che dovrebbe essere aggiunto a questo oggetto per renderlo utile, ad es. Sovraccaricare gli operatori $ e [[, nonché tutti i trucchi che dovrei cercare. Non sono un esperto di R.
Punti bonus per una soluzione di riferimento pass-agnostica che si integra perfettamente con R, sebbene le mie esigenze siano esclusivamente con frame di dati.
Non credo che la premessa nella tua domanda sia corretta. R copia solo le modifiche, quindi puoi tranquillamente passare i commenti sullo stack delle chiamate senza fare nuove copie, purché non cambi l'oggetto.Proverò a trovarti qualche riferimento su questo in un minuto. – Andrie
Vedere ad esempio questa domanda e la sua risposta da @matthewdowle: http://stackoverflow.com/q/10225098/602276 – Andrie
Andrie ha ragione. Sorpreso che non hai trovato ['data.table'] (http://datatable.r-forge.r-project.org/LondonR_2012.pdf) nelle tue ricerche per' data.frame' di grandi dimensioni. Cosa hai cercato? –