2012-05-18 12 views
15

Me gustaría comprender la lógica que R utiliza al pasar argumentos a funciones, crear copias de variables, etc. con respecto al uso de la memoria. ¿Cuándo realmente crea una copia de la variable frente a solo pasar una referencia a esa variable? En particular, las situaciones Tengo curiosidad son:R, copias profundas y superficiales, pase por referencia

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

Es a ser pasado literalmente, o es una referencia a una que se pasa?

x <- 1 
y <- x 

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

Si alguien pudiera explicarme esto, lo agradecería mucho.

+3

Usted puede encontrar [esto] (http://cran.at.r-project.org/doc/manuals/R -lang.html # Evaluación) sección de la definición de lenguaje R útil. – joran

+2

Este documento de Morandat y sus colegas tiene una discusión interesante y crítica de la evaluación perezosa de argumentos en R: http://www.cs.purdue.edu/homes/jv/pubs/ecoop12.pdf – jthetzel

+4

Usando 'tracemem' en un apropiado compilado R puede ser útil para la exploración, como puede '.Internal (inspeccionar (x))' con una comprensión del campo 'NAM'ED; mi mantra general es 'copia-en-cambio' así que por ejemplo tu 'y <- x' no dispara una copia (todavía) porque no ha habido ningún cambio en el original, la memoria apuntada por' x' (y ' y') es 'NAME ', de modo que la modificación de cualquiera activará una copia. –

Respuesta

12

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

?force 
?delayedAssign 

Una implicación práctica es que es muy difícil, si no imposible, evitar la necesidad de al menos el doble de memoria RAM como sus objetos nominalmente ocupan. 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 duplicación de copias. Si esa era 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. Fue SO-anunció con referencia a las noticias aquí: Returning anonymous functions from lapply - what is going wrong?

Y el interesting paper cited by jhetzel in the comments is now here:

+8

Ingrese ['data.table'] (http://datatable.r-forge.r-project.org/). Ver '? Copiar' en el paquete. La asignación por referencia es posible con el operador ': =', vea '?": = "' Y la serie de funciones 'set *'. En lugar de necesitar espacio para 2-3 copias del objeto completo, nuestro objetivo es solo necesitar una columna de memoria de trabajo o menos. –

Cuestiones relacionadas