tutorial studio sheet read mac data cheat r data.table colon-equals

studio - key data table r



¿Por qué data.table definido:=en lugar de sobrecargar<-? (2)

Hay dos lugares que <- podrían estar ''sobrecargados'':

x[i, j] <- value # 1 x[i, {colname <- value}] # 2

La primera copia la totalidad de x a *tmp* , cambia esa copia de trabajo y asigna de nuevo a x . Eso es una cosa R (src / main / eval.c y subassign.c) discutida recientemente en r-devel here . Parecía que podría ser posible cambiar R para permitir que los paquetes, o R en sí, eviten esa copia a *tmp* , pero actualmente no es posible, IIUC.

El segundo es a lo que se refiere la respuesta de Owen, creo. Si acepta que está bien hacer la asignación por referencia dentro de j así, ¿qué operador? De acuerdo con el comentario a la respuesta de Owen, los usuarios de j ya usan <- y <<- , así que encontramos := .

Incluso si [<- no copiamos la totalidad de x , todavía nos gusta := en j para que podamos hacer cosas como esta:

DT[,{newcol1:=sum(a) newcol2:=a/newcol1}, by=group]

Donde se agregan las nuevas columnas por referencia a la tabla, y se evalúa el RHS de cada := dentro de cada grupo. (Cuando: = dentro del grupo se implementa.)

Actualización oct 2012

A partir de 1.8.2 (en CRAN en julio de 2012), se implementó := por grupo para agregar o actualizar columnas individuales; es decir, solo LHS de := . Y ahora en v1.8.3 (en R-Forge al momento de escribir), se pueden agregar múltiples columnas por grupo; p.ej,

DT[, c("newcol1","newcol2") := .(sum(a),sum(b)), by=group]

O, quizás más elegantemente:

DT[,`:=`(newcol1=sum(a), newcol2=sum(b)), by=group]

Pero el RHS múltiple iterativo , previsto por un tiempo, donde la segunda expresión podría usar el resultado de la primera, aún no está implementado ( FR#1492 ). Por lo tanto, esto aún dará un error "newcol1 not found" y debe hacerse en dos pasos:

DT[,`:=`(newcol1=sum(a), newcol2=a/newcol1), by=group]

data.table ha introducido el operador: =. ¿Por qué no sobrecargar <-?


No creo que exista ninguna razón técnica por la que sea necesario, por la siguiente razón := solo se utiliza en el interior, [...] por lo que siempre se cita. [...] recorre el árbol de expresiones para ver si := está en él.

Eso significa que realmente no actúa como un operador y no está realmente sobrecargado; por lo que podrían haber elegido casi cualquier operador que quisieran. Supongo que tal vez se veía mejor? O menos confuso porque claramente no es <- ?

(Tenga en cuenta que si := se usó fuera de [...] él no podría ser <- , porque realmente no puede sobrecargar <- . <- No evalúa su argumento de izquierda, por lo que no sabe cuál es el tipo es).