¿`<-` también se usa para data.frames a veces mediante llamada por referencia? [duplicar]
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 z
copia de x
en caso t>=5
y una copia de y
lo contrario. Sin embargo, y
tambié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
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
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