Tôi đã nhận thấy một số hành vi không phù hợp (không phù hợp với tôi) trong dữ liệu. Có thể sử dụng khi sử dụng các toán tử gán khác nhau. Tôi phải thừa nhận tôi không bao giờ hoàn toàn có sự khác biệt giữa "=" và copy(), vì vậy có lẽ chúng ta có thể làm sáng tỏ ở đây. Nếu bạn sử dụng "=" hoặc "< -" thay vì sao chép() bên dưới, khi thay đổi dữ liệu đã sao chép. Có thể, dữ liệu gốc cũng có thể thay đổi.data.table 1.8.1 .: "DT1 = DT2" không giống với DT1 = copy (DT2)?
Vui lòng thực hiện các lệnh sau đây và bạn sẽ thấy những gì tôi có nghĩa là
library(data.table)
example(data.table)
DT
x y v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9
DT2 = DT
bây giờ tôi sẽ thay đổi cột v của DT2:
DT2[ ,v:=3L]
x y v
1: a 1 3
2: a 3 3
3: a 6 3
4: b 1 3
5: b 3 3
6: b 6 3
7: c 1 3
8: c 3 3
9: c 6 3
nhưng hãy nhìn những gì đã xảy ra với DT:
DT
x y v
1: a 1 3
2: a 3 3
3: a 6 3
4: b 1 3
5: b 3 3
6: b 6 3
7: c 1 3
8: c 3 3
9: c 6 3
cũng đã thay đổi. vì vậy: thay đổi DT2 đã thay đổi DT ban đầu. không phải vậy nếu tôi sử dụng copy():
example(data.table) # reset DT
DT3 <- copy(DT)
DT3[, v:= 3L]
x y v
1: a 1 3
2: a 3 3
3: a 6 3
4: b 1 3
5: b 3 3
6: b 6 3
7: c 1 3
8: c 3 3
9: c 6 3
DT
x y v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9
là hành vi này mong đợi?
Cảm ơn @Andrie. Tôi hiểu nhiệm vụ bằng cách tham khảo, và tại sao để tránh sao chép ở nơi đầu tiên. Nó chỉ có vẻ lạ với tôi rằng '=' tạo ra một liên kết giữa bản sao và bản gốc, như thể chúng là cùng một đối tượng (khi đó không phải là trường hợp trong R nếu không). –
@ FlorianOswald Tôi đồng ý - điều này có thể là một chút bẫy nếu một người không cẩn thận. – Andrie
+10 nếu tôi có thể Andrie. @ Florian Hãy tưởng tượng một bảng 20 GB + trong bộ nhớ. Chúng tôi hoàn toàn không muốn sao chép nó, thậm chí một lần. Nhưng nếu bạn thực sự muốn, bạn có thể. Nó không phá vỡ tính tương thích với các gói khác, bởi vì nó chỉ có các hàm ': =' và 'set *' gán theo tham chiếu. Đó là một trong những lý do chúng tôi giới thiệu toán tử mới (': ='), thay vì làm cho '<-' hoạt động khác đi. –