¿`<-` también se usa para data.frames a veces mediante llamada por referencia? [duplicar]

Resuelto Noskario asked hace 54 años • 2 respuestas

Tengo un problema simple que quería resolver usando data.table. Me sorprendió el siguiente comportamiento, ya que pensé que las asignaciones en base R siempre se copian:

library(data.table)
df <- data.frame(
  t = 1:10,
  x = "x",
  y = "y"
)
df$z <- df$y # I was assuming this is a full blown copy (since done in base R)
setDT(df)
df[t>=5, `:=`(z=x)]
df

Entonces, al final quiero tener para la columna una zcopia de xen caso t>=5y una copia de ylo contrario. Sin embargo, ytambién ha cambiado, lo que me sorprende. ¿Cuál es la razón para eso?

     t x y z
 1:  1 x y y
 2:  2 x y y
 3:  3 x y y
 4:  4 x y y
 5:  5 x x x
 6:  6 x x x
 7:  7 x x x
 8:  8 x x x
 9:  9 x x x
10: 10 x x x
Noskario avatar Jan 01 '70 08:01 Noskario
Aceptado

data.table tiene su propia forma de hacer las cosas; del cual descubrió un ejemplo, tratando de ahorrar memoria porque en el punto donde ocurre el setdf las columnas apuntan a una única fuente. Para solucionar este problema, puede optar por crear z en la parte data.table;

aquí hay un ejemplo con encadenamiento

library(data.table)
df <- data.frame(
  t = 1:10,
  x = "x",
  y = "y"
)

setDT(df)[, z := copy(y)][t>=5, z := x]
df
Nir Graham avatar Feb 15 '2024 17:02 Nir Graham

Generalmente, la base R "copia al escribir", lo que significa que si cambia algo en el vector, el vector se copia.

df <- data.frame(
  t = 1:10,
  x = "x",
  y = "y"
)
df$z <- df$y
df$z[1] <- df$z[1] # THIS causes the copy-on-write
setDT(df)
df[t>=5, `:=`(z=x)]
df
#         t      x      y      z
#     <int> <char> <char> <char>
#  1:     1      x      y      y
#  2:     2      x      y      y
#  3:     3      x      y      y
#  4:     4      x      y      y
#  5:     5      x      y      x
#  6:     6      x      y      x
#  7:     7      x      y      x
#  8:     8      x      y      x
#  9:     9      x      y      x
# 10:    10      x      y      x
r2evans avatar Feb 15 '2024 17:02 r2evans