r reference copy deep-copy data.table

R, copias profundas y superficiales, pase por referencia



reference copy (1)

Me gustaría entender la lógica que usa R cuando pasa argumentos a funciones, creando copias de variables, etc. con respecto al uso de la memoria. ¿Cuándo crea realmente una copia de la variable en lugar de simplemente pasar una referencia a esa variable? En particular las situaciones de las que tengo curiosidad son:

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

¿Es a ser pasado literalmente o es una referencia a un ser pasado?

x <- 1 y <- x

Referencia de la copia? ¿Cuándo no es este el caso?

Si alguien me pudiera explicar esto, lo apreciaría mucho.


Cuando pasa variables, siempre es por copia en lugar de por referencia. A veces, sin embargo, no obtendrá una copia hasta que realmente se realice una asignación. La descripción real del proceso es paso a paso. Echa un vistazo a la documentación.

?force ?delayedAssign

Una implicación práctica es que es muy difícil, si no imposible, evitar el uso de al menos el doble de RAM de la que ocupan nominalmente los objetos. La modificación de un objeto grande generalmente requerirá hacer una copia temporal.

actualización: 2015: Estoy de acuerdo (y lo hice) con Matt Dowle en que su paquete data.table proporciona una ruta alternativa a la asignación que evita el problema de copia-duplicación. Si esa fue la actualización solicitada, entonces no la entendí en el momento en que se hizo la sugerencia.

Hubo un cambio reciente en R 3.2.1 en las reglas de evaluación para apply y Reduce . Se anunció SO con referencia a las Noticias aquí: Devolviendo funciones anónimas de lapply - ¿qué está mal?

Y el interesante artículo citado por jhetzel en los comentarios ya está aquí :