valores valor sirve retornan referencia que por paso parámetros parametros para funciones entre diferencia cuál con performance r dataframe data.table proto

performance - valor - R: Pasando un cuadro de datos por referencia



parametros por referencia c++ (1)

La premisa de la pregunta es (en parte) incorrecta. R funciona como paso por promesa y hay copias repetidas en la forma en que se describe solo cuando se realizan nuevas asignaciones y alteraciones en el marco de datos a medida que se cumple la promesa. Por lo tanto, el número de copias no será de tamaño N * donde N es la profundidad de la pila, sino donde N es el número de niveles donde se realizan las asignaciones. Sin embargo, tienes razón en que los entornos pueden ser útiles. Veo en el siguiente enlace que ya ha encontrado el paquete ''proto''. También hay una introducción relativamente reciente de una "clase de referencia", a veces denominada "R5", donde R / S3 era el sistema de clases original de S3 que se copia en R y R4 sería el sistema de clases más reciente que parece ser compatible con la mayoría. El desarrollo del paquete BioConductor.

Aquí hay un enlace a un ejemplo de Steve Lianoglou (en un hilo que discute los méritos de las clases de referencia) de incrustar un entorno dentro de un objeto S4 para evitar los costos de copia:

https://stat.ethz.ch/pipermail/r-help/2011-September/289987.html

El paquete ''data.table'' de Matthew Dowle crea una nueva clase de objeto de datos cuya semántica de acceso que utiliza "[" es diferente a la de los cuadros de datos R normales, y que realmente funciona como paso por referencia. Tiene una velocidad de acceso y procesamiento superior. También puede recurrir a la semántica del marco de datos, ya que en años posteriores tales objetos ahora heredan la clase ''data.frame''.

También es posible que desee investigar el paquete de dataframe de Hesterberg .

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 de reutilización / legibilidad / mantenibilidad y cuando ese código necesita manipular grandes estructuras de datos a través de, por ejemplo, marcos de datos grandes, a través de una serie de transformaciones / operaciones, la semántica pasa por valor. a una gran cantidad de copias de datos alrededor y muchas sacudidas de pila (algo malo). Por ejemplo, un marco de datos que toma 50 Mb en el montón que se pasa como un parámetro de función se copiará como mínimo el mismo número de veces que la profundidad de la llamada de 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 un marco de datos transformado / modificado desde lo más profundo de la cadena de llamadas, la copia aumenta en otra N.

La pregunta SO ¿ Cuál es la mejor manera de evitar pasar un marco de datos? toca este tema, pero está redactado de manera que evite hacer directamente la pregunta de paso por referencia y la respuesta ganadora básicamente dice: "sí, el paso por valor es cómo funciona R". Eso no es realmente 100% exacto. Los entornos R habilitan semánticas paso a paso y los marcos OO como proto utilizan esta capacidad ampliamente. Por ejemplo, cuando un objeto proto se pasa como un argumento de función, mientras que su "envoltorio mágico" se pasa por valor, al desarrollador de R la semántica es paso por referencia.

Parece que pasar un marco de big data por referencia sería un problema común y me pregunto cómo lo han abordado otros y si hay alguna biblioteca que lo permita. 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. Apreciaría los indicadores 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 error que deba tener en cuenta ”. No soy un experto en R

Puntos de bonificación para una solución de paso por referencia de tipo agnóstico que se integra muy bien con R, aunque mis necesidades son exclusivamente con marcos de datos.