Değişkenleri programlı olarak seçmenin iki yolu :
with = FALSE:
DT = data.table(col1 = 1:3)
colname = "col1"
DT[, colname, with = FALSE]
'nokta nokta' ( ..) öneki:
DT[, ..colname]
'Nokta nokta' ( ..) gösteriminin daha fazla açıklaması için, 1.10.2'deki Yeni Özellikler'e bakın (şu anda yardım metninde açıklanmamaktadır).
To atamak değişken (ler) kadar olan LHS sarmak :=parantez içinde:
DT[, (colname) := 4:6]
İkincisi, sütun çizimi olarak bilinir , çünkü tüm sütun vektörünü referansla değiştirirsiniz. Bir alt küme varsa i, referansa göre alt atanır. Etrafında parens (colname)CRAN Eki üzerinde versiyon v1.9.4 tanıtılan bir kısaltmadır 2014 İşte haber :
Kullanımı with = FALSEile :=artık her durumda kullanımdan kaldırılmıştır ait LHS sarma göz önüne alındığında :=parantez ile bir süre tercih edilmiştir.
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 = ...]
Ayrıca şuradaki Ayrıntılar bölümüne bakın ?`:=`:
DT[i, (colnamevector) := value]
Ve yorumda daha fazla soruyu yanıtlamak için işte bir yol var (her zamanki gibi birçok yol vardır):
DT[, colname := cumsum(get(colname)), with = FALSE]
ya, sen daha kolay okumak için sadece yazı göndermekte ve hata ayıklama bulabilir evalbir pastebir sunucuya göndermek için dinamik bir SQL deyimi inşa benzer,:
expr = paste0("DT[,",colname,":=cumsum(",colname,")]")
expr
eval(parse(text=expr))
Bunu çok yaparsanız, bir yardımcı işlev tanımlayabilirsiniz EVAL:
EVAL = function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))
EVAL("DT[,",colname,":=cumsum(",colname,")]")
Şimdi bu data.table1.8.2 otomatik olarak optimize jverimlilik için, kullanımı tercih edilebilir evalbir yöntem. get()İçerisinde j, örneğin, bazı en iyi duruma engel olur.
Veya var set(). Düşük ek yük, işlevsel bir form, :=burada sorun olmaz. Bakın ?set.
set(DT, j = colname, value = cumsum(DT[[colname]]))
DT