Pregunta

Me gustaría entender la lógica que usa R al pasar argumentos a funciones, crear copias de variables, etc.con respecto al uso de memoria.¿Cuándo crea realmente una copia de la variable vs.¿Simplemente pasando una referencia a esa variable?En particular, las situaciones que me interesan son:

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

Es a ¿Se pasa literalmente o es una referencia a un pase?

x <- 1
y <- x

¿Referencia de copia?¿Cuándo no es así?

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

¿Fue útil?

Solución

Cuando pasa variables, siempre es por copia y no por referencia.A veces, sin embargo, no obtendrá una copia hasta que realmente se realice la tarea.La verdadera descripción del proceso es la de pasar por promesa.Echa un vistazo a la documentación.

?force
?delayedAssign

Una implicación práctica es que es muy difícil, si no imposible, evitar necesitar al menos el doble de RAM de la que ocupan nominalmente sus objetos.Para modificar un objeto grande generalmente será necesario realizar una copia temporal.

actualizar:2015:Estoy (y estuve) de acuerdo con Matt Dowle en que su paquete data.table proporciona una ruta alternativa para la asignación que evita el problema de la 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.Así lo anunció con referencia a las noticias aquí: Devolver funciones anónimas desde lapply: ¿qué está pasando?

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

Otros consejos

Respuesta tardía, pero un aspecto muy importante del diseño del lenguaje que no recibe suficiente cobertura en la web (o al menos en las fuentes habituales).

x <- c(0,4,2)
lobstr::obj_addr(x)
# [1] "0x7ff25e82b0f8"
y <- x
lobstr::obj_addr(y)
# [1] "0x7ff25e82b0f8"

Observe la "dirección de memoria" idéntica, es decirla ubicación en la memoria donde se almacena el objeto.Así podrás confirmar que x y y ambos apuntan al mismo identificador.

El libro Advanced R de Hadley Wickham toca esto:

Considere este código:

x <- c(1, 2, 3)

Es fácil leerlo como:"Cree un objeto llamado 'X', que contenga los valores 1, 2 y 3".Desafortunadamente, esa es una simplificación que conducirá a predicciones inexactas sobre lo que R realmente está haciendo detrás de escena.Es más exacto decir que este código está haciendo dos cosas:

Está creando un objeto, un vector de valores, c(1, 2, 3).Y es vinculante ese objeto a un nombre, x.En otras palabras, el objeto, o valor, no tiene un nombre;en realidad es el nombre el que tiene un valor.

Tenga en cuenta que las direcciones de memoria son efímeras y cambian con cada nueva sesión de R.

Ahora aquí está la parte importante.

En la semántica de R, los objetos se copian por valor.Esto significa que modificar la copia deja intacto el objeto original.Dado que copiar datos en la memoria es una operación costosa, las copias en R son lo más flojas posible.Sólo ocurren cuando el nuevo objeto se modifica realmente.Fuente:[Documentación en idioma R][1]

Entonces si ahora modificamos el valor de y añadiendo un valor al vector, y ahora apunta a un "objeto" diferente.Esto concuerda con lo que dice la documentación con respecto a una operación de copia que ocurre "solo cuando se modifica el nuevo objeto" (perezoso). y está apuntando a una dirección diferente a la que estaba anteriormente.

y <- c(y, -3)
print(lobstr::obj_addr(y))
# [1] "0x7ff25e825b48"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top