Подключенные копии data.tables [дубликаты]

Во время моего рабочего процесса я часто делаю копию основного data.frame/data.table, над которой я выполняю некоторые аспекты работы, а затем некоторые другие в другой копии, прежде чем присоединиться к ним или что-то еще позже. Однако я часто сталкиваюсь с тем, что эти копии все еще связаны друг с другом. Так что правки, сделанные на одном, также выполняются и на другом. К сожалению, я не могу это воспроизвести, но копипаст с моей консоли выглядит примерно так:

# 'used3' is a copy of 'used' with some altercations to it 
c("nLocs","nDays") %in% names(used)
[1] FALSE FALSE
> used3[, nDays :=uniqueN(yDay),c("ID","Year","Season")]
> used3[, nLocs :=.N,c("ID","Year","Season")]
> c("nLocs","nDays") %in% names(used)
[1] TRUE TRUE

Так что изменения, сделанные на копии, также сделаны и на оригинале. Это ошибка? Я называю их слишком похожими именами... или что?

R-версия: 3.3 версия data.table: 1.9.6

Но также имеет опыт работы с более старыми версиями как R, так и data.table.


person ego_    schedule 09.08.2016    source источник
comment
Посмотрите на ?data.table::copy   -  person jbaums    schedule 09.08.2016
comment
Спасибо! Это был один из тех, как я пропустил это?!. Должны ли вы добавить это как ответ, чтобы я мог его принять?   -  person ego_    schedule 09.08.2016
comment
См. также этот и связанные с ним вопросы. Также это   -  person David Arenburg    schedule 09.08.2016


Ответы (1)


Вы не должны видеть такое поведение с data.frame, но вы увидите его для data.table объектов.

?data.table::copy объясняет, что data.tables предотвращают создание копий везде, где это возможно, и в результате после изменения data.table операторами set* или :=, такими как:

library(data.table)
A <- data.table(x=1:10)
B <- A
A[, y:=10:1]

B
##      x  y
##  1:  1 10
##  2:  2  9
##  3:  3  8
##  4:  4  7
##  5:  5  6
##  6:  6  5
##  7:  7  4
##  8:  8  3
##  9:  9  2
## 10: 10  1

A и B по-прежнему идентичны (т.е. элемент y был добавлен к обоим).

Суть в том, что для создания копии data.table вы можете вместо этого сделать:

A <- data.table(x=1:10)
B <- copy(A)
A[, y:=10:1]

B
##      x
##  1:  1
##  2:  2
##  3:  3
##  4:  4
##  5:  5
##  6:  6
##  7:  7
##  8:  8
##  9:  9
## 10: 10

Обратите внимание, что использование оператора $ для добавления элемента в data.table делает приводит к созданию копии:

A <- data.table(x=1:10)
B <- A
A$y <- 10:1

B
##      x
##  1:  1
##  2:  2
##  3:  3
##  4:  4
##  5:  5
##  6:  6
##  7:  7
##  8:  8
##  9:  9
## 10: 10
person jbaums    schedule 09.08.2016