Kể từ <-.data.table
không tạo một bản sao, bạn có thể sử dụng <-
:
Tạo một đối tượng data.table:
library(data.table)
di <- data.table(iris)
Tạo một cột mới:
di <- di[, z:=1:nrow(di)]
di
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species z
# [1,] 5.1 3.5 1.4 0.2 setosa 1
# [2,] 4.9 3.0 1.4 0.2 setosa 2
# [3,] 4.7 3.2 1.3 0.2 setosa 3
# [4,] 4.6 3.1 1.5 0.2 setosa 4
# [5,] 5.0 3.6 1.4 0.2 setosa 5
# [6,] 5.4 3.9 1.7 0.4 setosa 6
# [7,] 4.6 3.4 1.4 0.3 setosa 7
# [8,] 5.0 3.4 1.5 0.2 setosa 8
# [9,] 4.4 2.9 1.4 0.2 setosa 9
# [10,] 4.9 3.1 1.5 0.1 setosa 10
# First 10 rows of 150 printed.
Nó cũng đáng ghi nhớ rằng R chỉ in giá trị của một đối tượng trong tương tác chế độ e.
Vì vậy, trong chế độ hàng loạt, bạn có thể chỉ cần sử dụng:
di[, z:=1:nrow(di)]
này sẽ không tạo ra bất kỳ đầu ra khi chạy như một kịch bản trong chế độ hàng loạt.
thông tin
Hơn nữa từ Matthew Dowle:
Cũng xem FAQ 2.21 và 2.22:
2,21 Tại sao DT[i,col:=value]
trả lại toàn bộ DT
? Tôi mong đợi hoặc không có giá trị hiển thị (phù hợp với <-
) hoặc giá trị trả về hoặc thông báo chứa số lượng hàng được cập nhật. Nó không phải là rõ ràng rằng các dữ liệu đã thực sự được cập nhật bằng cách tham khảo.
Vì vậy, cú pháp ghép đó có thể hoạt động; ví dụ: DT[i,done:=TRUE][,sum(done)]
. Số hàng được cập nhật được trả lại khi độ dài được bật, trên cơ sở mỗi truy vấn hoặc trên toàn cầu sử dụng options(datatable.verbose=TRUE)
.
2.22 Ok, nhưng không thể trả về giá trị trả lại là DT[i,col:=value]
không xác định, sau đó?
- Chúng tôi đã thử nhưng R nội lực buộc hiển thị trên cho
[
. Giá trị của Cột eval của FunTab (xem src/main/names.c) cho [
là 0
có nghĩa là bắt buộc R_Visible
bật (xem phần R-Internals 1.6). Do đó, khi chúng tôi đã thử invisible()
hoặc đặt R_Visible
thành 0
trực tiếp, eval
trong src/main/eval.c sẽ bắt đầu lại.
- Sau khi quen với hành vi này, bạn có thể phát triển để thích nó hơn (chúng tôi có). Xét cho cùng, chúng ta sẽ phân bổ bao nhiêu lần bằng cách sử dụng
<-
và sau đó ngay lập tức xem xét dữ liệu để kiểm tra xem có ổn không?
- Chúng tôi có thể kết hợp
:=
vào j
cũng trả về dữ liệu; bản cập nhật hỗn hợp và chọn trong một truy vấn. Để phát hiện xem j
chỉ cập nhật (và sau đó hành xử một cách nhẹ nhàng) có thể gây nhầm lẫn.
Second cập nhật từ Matthew Dowle:
Bây giờ chúng ta đã tìm thấy một giải pháp và v1.8.3 không còn in kết quả khi :=
được sử dụng. Chúng tôi sẽ cập nhật Câu hỏi thường gặp 2.21 và 2.22.
Cảm ơn! Tôi sẽ sử dụng '<-' trong trường hợp đó. –
+10 Tôi không nghĩ thử 'DT <-DT [i, col: = value]'. Sự lặp lại của tên biến không phải là tuyệt vời, nhưng hoạt động. Điều đó mang lại cho tôi một ý tưởng làm thế nào để có được 'DT [i, col: = value]' để trả về vô hình: bây giờ được nâng lên như [FR # 2128] (https://r-forge.r-project.org/tracker/index. php? func = chi tiết & trợ giúp = 2128 & group_id = 240 & atid = 978), cảm ơn! –
+1 cho thông minh hùng mạnh hack + đoạn trích thú vị từ Câu hỏi thường gặp. –