2012-06-25 2 views
6

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?

Trả lời

10

Có. Đây là hành vi mong đợi và được ghi chép đầy đủ.

data.table sử dụng tham chiếu đến đối tượng ban đầu để đạt được sửa đổi tại chỗ, nó rất nhanh.

Vì lý do này, nếu bạn thực sự muốn sao chép dữ liệu, bạn cần phải sử dụng copy(DT)


Từ tài liệu cho ?copy:

Các data.table được sửa đổi bởi tham chiếu và được trả về (vô hình) để nó có thể được sử dụng trong các câu lệnh ghép; ví dụ: setkey(DT,a)[J("foo")]. Nếu bạn yêu cầu một bản sao, trước tiên hãy lấy một bản sao (sử dụng DT2=copy(DT)). copy() đôi khi cũng có thể hữu ích trước khi := được sử dụng để chuyển sang cột bằng cách tham chiếu. Xem ?copy.

cũng Xem câu hỏi này: Understanding exactly when a data.table is a reference to vs a copy of another

+0

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). –

+0

@ 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

+1

+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. –