Hai cách để chọn (các) biến theo chương trình :
with = FALSE
:
DT = data.table(col1 = 1:3)
colname = "col1"
DT[, colname, with = FALSE]
..
tiền tố 'dot dot' ( ):
DT[, ..colname]
Để biết thêm mô tả về ..
ký hiệu 'dấu chấm' ( ), hãy xem Các tính năng mới trong 1.10.2 (nó hiện không được mô tả trong văn bản trợ giúp).
Để gán cho (các) biến, hãy đặt LHS của :=
trong dấu ngoặc đơn:
DT[, (colname) := 4:6]
Cái sau được gọi là plonk cột , vì bạn thay thế toàn bộ vectơ cột bằng tham chiếu. Nếu có một tập hợp con i
, nó sẽ gán lại bằng tham chiếu. Parens around (colname)
là một cách viết tắt được giới thiệu trong phiên bản v1.9.4 vào CRAN tháng 10 năm 2014. Đây là mục tin tức :
Việc sử dụng with = FALSE
with :=
hiện không được chấp nhận trong mọi trường hợp, do việc bao bọc LHS của :=
bằng dấu ngoặc đơn đã được ưu tiên trong một thời gian.
colVar = "col1"
DT[, colVar := 1, with = FALSE]
DT[, (colVar) := 1]
DT[, c("col1", "col2") := 1]
DT[, 2:4 := 1]
DT[, c("col1","col2") := list(sum(a), mean(b)]
DT[, `:=`(...), by = ...]
Xem thêm phần Chi tiết tại ?`:=`
:
DT[i, (colnamevector) := value]
Và để trả lời câu hỏi khác trong nhận xét, đây là một cách (như thường lệ, có nhiều cách):
DT[, colname := cumsum(get(colname)), with = FALSE]
hoặc, bạn có thể thấy dễ dàng hơn khi đọc, viết và gỡ lỗi chỉ với eval
một paste
, tương tự như việc xây dựng một câu lệnh SQL động để gửi đến máy chủ:
expr = paste0("DT[,",colname,":=cumsum(",colname,")]")
expr
eval(parse(text=expr))
Nếu bạn làm điều đó nhiều, bạn có thể xác định một hàm trợ giúp EVAL
:
EVAL = function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))
EVAL("DT[,",colname,":=cumsum(",colname,")]")
Bây giờ data.table
1.8.2 tự động tối ưu hóa j
để tăng hiệu quả, có thể bạn nên sử dụng eval
phương pháp này. Các get()
trong j
ngăn ngừa một số tối ưu, ví dụ.
Hoặc, có set()
. Một hình thức chức năng, chi phí thấp :=
, sẽ ổn ở đây. Thấy chưa ?set
.
set(DT, j = colname, value = cumsum(DT[[colname]]))
DT