Chỉ để xóa một số nội dung cho bản thân, tôi muốn hiểu rõ hơn khi nào các bản sao được tạo và khi chúng không ở trong data.table
. Như câu hỏi này chỉ ra Understanding exactly when a data.table is a reference to (vs a copy of) another data.table, nếu một người chỉ đơn giản là chạy dữ liệu sau rồi bạn kết thúc sửa đổi bản gốc:tìm hiểu các thuộc tính tham chiếu của dữ liệu. Có thể trong R
library(data.table)
DT <- data.table(a=c(1,2), b=c(11,12))
print(DT)
# a b
# [1,] 1 11
# [2,] 2 12
newDT <- DT # reference, not copy
newDT[1, a := 100] # modify new DT
print(DT) # DT is modified too.
# a b
# [1,] 100 11
# [2,] 2 12
Tuy nhiên, nếu một thực hiện điều này (ví dụ), sau đó bạn kết thúc sửa đổi phiên bản mới:
DT = data.table(a=1:10)
DT
a
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10
newDT = DT[a<11]
newDT
a
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10
newDT[1:5,a:=0L]
newDT
a
1: 0
2: 0
3: 0
4: 0
5: 0
6: 6
7: 7
8: 8
9: 9
10: 10
DT
a
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10
theo tôi được biết, lý do điều này xảy ra là bởi vì khi bạn thực hiện một tuyên bố i
, data.table
trả về một bảng hoàn toàn mới như trái ngược với một tham chiếu đến bộ nhớ bị chiếm đóng bởi các yếu tố lựa chọn của người già data.table
. Điều này có đúng không?
EDIT: xin lỗi tôi có nghĩa là i
không j
(thay đổi này ở trên)
Ngay cả 'newDT <- DT [x <11] 'sẽ tạo một bản sao. Thực hiện, 'newDT [, b: = 5]' sau khi tạo 'newDT' bằng cách subsetting. Sử dụng 'tracemem' và' .Internal (inspect (.)) 'Là các công cụ cung cấp thông tin để hiểu điều này. – Arun
@Arun: Tôi xin lỗi tôi không chắc chắn tôi hiểu điểm của bạn .. bạn có thể giải thích những gì bạn đang đề cập đến không? bạn có ý nói rằng ví dụ đầu tiên sẽ làm việc giống như ví dụ thứ hai? trong trường hợp đó có - đó là sự thật. tôi chỉ muốn một ví dụ riêng để làm rõ mọi thứ. – Alex
chắc chắn, bạn có thể giải thích câu lệnh 'j' nào bạn đang đề cập đến ở đây không:' Như tôi đã hiểu, lý do điều này xảy ra là vì khi bạn thực hiện câu lệnh j, chỉ để chắc chắn. Tôi sẽ viết một câu trả lời với những gì tôi đã nói về sau đó. – Arun