копировать() при использовании data.table внутри функций

#r #data.table

#r #data.table

Вопрос:

В своих проектах я обычно готовлю данные с помощью нескольких функций, поэтому мой код обычно выглядит так:

 readAndClean("directory") %>% 
  processing() %>% 
  readyForModelling()
  

Где я передаю объект data.table из одной функции в другую.

У меня появилась привычка всегда запускать эти функции с:

 processing <- function(data_init){
  data <- copy(data_init)
}
  

чтобы избежать внесения изменений в DT в глобальной среде, как показано в следующем примере,:

 test <- data.table(cars[1:10,])

processing <- function(data_init){
  data_init[, id := 1:.N]
  
  return("done")
}

test
#    speed dist
# 1:     4    2
# 2:     4   10
# 3:     7    4
# 4:     7   22
# 5:     8   16
# 6:     9   10
# 7:    10   18
# 8:    10   26
# 9:    10   34
# 10:    11   17
processing(test)
# [1] "done"

test
#    speed dist id
# 1:     4    2  1
# 2:     4   10  2
# 3:     7    4  3
# 4:     7   22  4
# 5:     8   16  5
# 6:     9   10  6
# 7:    10   18  7
# 8:    10   26  8
# 9:    10   34  9
# 10:    11   17 10
  

Но это всегда кажется мне немного уродливым.
Это правильный способ обработки data.tables внутри функций?

Комментарии:

1. Использование copy такого рода сводит на нет назначение data.table, потому что вы потеряете большую часть его эффективности.

2. @Roland даже если это только один раз в начале кода? После этого я выполняю несколько агрегаций, объединений и создания переменных с скопированной таблицей.

3. Тогда у вас все еще может быть некоторая выгода, но глубокое копирование очень дорого с точки зрения производительности. Это не будет иметь большого значения, если ваши данные довольно малы, и вы используете data.table в первую очередь из-за его приятного синтаксиса. Чего я не понимаю, так это почему вы хотите избежать изменения исходного data.table в вашем конкретном случае. Я бы подумал, что изменение на месте было бы довольно удобно, если вы выполняете «подготовку данных».

4. Я думаю, если у вас есть несколько параллельных processing() шагов, работающих с одними и теми же необработанными данными, вы хотели бы оставить необработанные данные как есть, или если вы тестировали и хотели сравнить обработку до и после. Но если это большой набор данных, я бы постарался максимально использовать модификацию на месте и не создавать дубликаты моих данных. Концептуально все еще полезно упорядочивать вещи, как вы делаете.