функции документов (процедур) для сведения.объекты таблицы


Software for Data Analysis: Programming with R<-

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

proc1data.tablexproc1x:=proc1proc1(x=x1)x1x1proc1

Во-первых, это технический вопрос. Представьте, что функция Р называется, что принимает объект в качестве аргумента (кроме, возможно, других параметров). возвращает null, но изменяет используя . Насколько я понимаю, называя делает копию всего тем, что обещает работу. Однако, как показано ниже, исходный объект все-таки изменены . Почему/как это?

> require(data.table)> x1 <- CJ(1:2, 2:3)> x1   V1 V21:  1  22:  1  33:  2  24:  2  3> proc1 <- function(x){+ x[,y:= V1*V2]+ NULL+ }> proc1(x1)NULL> x1   V1 V2 y1:  1  2 22:  1  3 33:  2  2 44:  2  3 6> 
proc1(x=x1)

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

> x1 <- CJ(1:2000, 1:500)> x1[, paste0("V",3:300) := rnorm(1:nrow(x1))]> proc1 <- function(x){+ x[,y:= V1*V2]+ NULL+ }> system.time(proc1(x1))   user  system elapsed    0.00    0.02    0.02 > x1 <- CJ(1:2000, 1:500)> system.time(x1[,y:= V1*V2])   user  system elapsed    0.03    0.00    0.03 

Таким образом, учитывая, что передача данных.аргумент таблицы, чтобы функция не добавляет времени, что позволяет писать процедуры для данных.объекты таблиц, включающих как скорости данных.стол и обобщения функции. Однако, учитывая, что Джон Чемберс сказал, что функции не должны иметь побочных эффектов, это действительно "ОК", чтобы написать этот тип процедурного программирования в R? Почему он утверждает, что побочные эффекты являются "плохими"? Если я буду игнорировать его советы, какие подводные камни нужно знать? Что я могу сделать, чтобы писать "хорошие" данные.процедуры таблице?