R tiene una semántica de paso por valor, que minimiza los efectos secundarios accidentales (algo bueno). Sin embargo, cuando el código está organizado en muchas funciones/métodos para reusabilidad/legibilidad/mantenibilidad y cuando ese código necesita manipular estructuras de datos grandes a través de, por ejemplo, marcos de datos grandes, a través de una serie de transformaciones/operaciones, los hilos semánticos pasan por valor a una gran cantidad de copia de datos en todo y mucha agitación de montón (algo malo). Por ejemplo, un marco de datos que toma 50Mb en el montón pasado como parámetro de función se copiará como mínimo la misma cantidad de veces que la profundidad de la llamada a la función y el tamaño del montón en la parte inferior de la pila de llamadas será N * 50Mb. Si las funciones devuelven una trama de datos transformada/modificada desde lo profundo de la cadena de llamada, entonces la copia sube por otra N.R: Al pasar un marco de datos por referencia
La pregunta What is the best way to avoid passing a data frame around? de SO toca este tema pero está redactada de una manera que evita preguntar directamente el pase -pregunta de referencia y la respuesta ganadora básicamente dice: "sí, pase-por-valor es cómo funciona R". Eso no es realmente 100% exacto. Los entornos R permiten la semántica de paso a paso y los marcos OO como proto usan esta capacidad de forma extensiva. Por ejemplo, cuando se pasa un objeto proto como un argumento de función, mientras que su "envoltorio mágico" se pasa por valor, para el desarrollador R la semántica se pasa por referencia.
Parece que pasar un gran marco de datos por referencia sería un problema común y me pregunto cómo se han acercado otros y si hay bibliotecas que lo permitan. En mi búsqueda, no he descubierto uno.
Si no hay nada disponible, mi enfoque sería crear un objeto proto que envuelva un marco de datos. Agradecería sugerencias sobre el azúcar sintáctico que debería agregarse a este objeto para que sea útil, por ejemplo, sobrecargar los operadores $ y [[,] así como cualquier combinación que debería tener en cuenta. No soy un experto en R
Puntos de bonificación para una solución de paso a paso de tipo agnóstico que se integra muy bien con R, aunque mis necesidades son exclusivamente con marcos de datos.
No creo que la premisa en su pregunta sea correcta. R solo copia al cambiar, por lo que puede pasar argumentos por la pila de llamadas sin hacer nuevas copias, siempre y cuando no cambie el objeto.Trataré de encontrar algunas referencias sobre esto en un minuto. – Andrie
Vea por ejemplo esta pregunta y su respuesta por @matthewdowle: http://stackoverflow.com/q/10225098/602276 – Andrie
Andrie tiene razón. Sorprendido de que no haya encontrado ['data.table'] (http://datatable.r-forge.r-project.org/LondonR_2012.pdf) en sus búsquedas de' data.frame' grande. ¿Qué buscabas? –