Dwa sposoby programowego wybierania zmiennych:
with = FALSE:
DT = data.table(col1 = 1:3)
colname = "col1"
DT[, colname, with = FALSE]
..Przedrostek „kropka kropka” ( ):
DT[, ..colname]
Więcej informacji na temat notacji „kropka kropka” ( ..) można znaleźć w sekcji Nowe funkcje w wersji 1.10.2 (obecnie nie jest ona opisana w tekście pomocy).
Aby przypisać do zmiennych, zawiń LHS lub :=w nawiasy:
DT[, (colname) := 4:6]
Ten ostatni jest znany jako plonk kolumny , ponieważ zastępujesz cały wektor kolumny przez odniesienie. Jeśli podzbiór ibył obecny, będzie to przypisywanie podrzędne przez odniesienie. Parens (colname)to skrót wprowadzony w wersji v1.9.4 w CRAN w październiku 2014 r. Oto aktualności :
Używanie with = FALSEwith :=jest teraz przestarzałe we wszystkich przypadkach, biorąc pod uwagę, że zawijanie LHS :=z nawiasami jest preferowane od jakiegoś czasu.
colVar = "col1"
DT[, (colVar) := 1]
DT[, c("col1", "col2") := 1]
DT[, 2:4 := 1]
DT[, c("col1","col2") := list(sum(a), mean(b))]
DT[, `:=`(...), by = ...]
Zobacz także sekcję Szczegóły w ?`:=`:
DT[i, (colnamevector) := value]
Aby odpowiedzieć na dalsze pytanie w komentarzu, oto jeden sposób (jak zwykle jest wiele sposobów):
DT[, colname := cumsum(get(colname)), with = FALSE]
lub, może być łatwiejsze czytanie, pisanie i debugowanie tylko do evala paste, podobnie do konstruowania dynamicznej instrukcji SQL do wysłania na serwer:
expr = paste0("DT[,",colname,":=cumsum(",colname,")]")
expr
eval(parse(text=expr))
Jeśli często to robisz, możesz zdefiniować funkcję pomocniczą EVAL:
EVAL = function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))
EVAL("DT[,",colname,":=cumsum(",colname,")]")
Teraz, gdy data.table1.8.2 automatycznie optymalizuje się jpod kątem wydajności, preferowane może być użycie tej evalmetody. get()W jzabezpiecza pewne optymalizacje, na przykład.
Albo jest set(). Niska, funkcjonalna forma :=, która byłaby tutaj w porządku. Zobacz ?set.
set(DT, j = colname, value = cumsum(DT[[colname]]))
DT