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 i
był 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 = FALSE
with :=
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 eval
a 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.table
1.8.2 automatycznie optymalizuje się j
pod kątem wydajności, preferowane może być użycie tej eval
metody. get()
W j
zabezpiecza 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