R 我是否需要对函数中的data.table对象使用copy()?

R 我是否需要对函数中的data.table对象使用copy()?,r,function,data.table,pass-by-reference,R,Function,Data.table,Pass By Reference,我是否需要在函数中使用copy(),以避免对input data.table进行不必要的修改 比如说 myfun <- function(mydata) { mydata[,newcolumn := .N,by=id] setnames(mydata, "newcolumn", "Count") return(table(mydata$Count)) } myfun来自@Henrik to的链接答案确实解释了回答您问题的所有细节 示例函数的此(修

我是否需要在函数中使用copy(),以避免对input data.table进行不必要的修改

比如说

myfun <- function(mydata) {   
     mydata[,newcolumn := .N,by=id]   
     setnames(mydata, "newcolumn", "Count")
     return(table(mydata$Count))
}

myfun来自@Henrik to的链接答案确实解释了回答您问题的所有细节

示例函数的此(修改)版本不会修改传递的
数据。表

library(data.table)
dt <- data.table(id = 1:4, a = LETTERS[1:4])
myfun2 <- function(mydata) {   
  x <- mydata[, .(newcolumn = .N), by=id]
  setnames(x, "newcolumn", "Count")
  return(table(x$Count))
}
myfun2(dt)
data.table
始终通过引用传递给函数,因此您必须小心不要修改它,除非您绝对确定要这样做

data.table
包的设计正是为了实现这种高效的数据修改方式,而无需使用通常的“COW”(“首次写入时拷贝”)原则来支持高效的数据操作

修改数据的“危险”操作。表主要包括:

  • :=
    修改或创建新列“就地”的分配
  • 所有
    设置*
    功能
如果您不想修改
数据表
,您可以只使用行筛选器和列(选择)表达式(
i
j
by
等参数)

如果在第二个(或更高版本)链中修改“按引用”,则链接也会阻止修改原始的
数据帧

myfun3 str(dt)
#类“data.table”和“data.frame”:4个obs。共有3个变量:
#$id:int 1 2 3 4
#$a:chr“a”“B”“C”“D”

Maybe related:Re最后一个问题,不,它不会自行创建副本。我认为他们最终希望导出
shallow
函数,这将减少此副本的浪费,简言之,使用copy(mydata)原始表不会受到影响。如果这是您想要的,那么建议将数据表复制到另一个表。因此,在第二个函数中,newColumn是在temp中创建的,而mydata表不受影响。@ManishSaraswat但是第一个函数是否会影响原始data.table,即使它在一个函数中?我一直在尝试,但似乎没有,但我担心这可能会产生意想不到的结果results@skan不,它在第一个函数中也不会影响。我忘了注意,因为它在函数内部,所以不会全局影响data.table。还是这样?
library(data.table)
dt <- data.table(id = 1:4, a = LETTERS[1:4])
myfun2 <- function(mydata) {   
  x <- mydata[, .(newcolumn = .N), by=id]
  setnames(x, "newcolumn", "Count")
  return(table(x$Count))
}
myfun2(dt)
> str(dt)
Classes ‘data.table’ and 'data.frame':  4 obs. of  2 variables:
 $ id: int  1 2 3 4
 $ a : chr  "A" "B" "C" "D"
myfun3 <- function(mydata) {
  # chaining also creates a copy 
  return(mydata[id < 3,][, a := "not overwritten outside"])
}

myfun3(dt)
# > str(dt)
# Classes ‘data.table’ and 'data.frame':    4 obs. of  3 variables:
# $ id: int  1 2 3 4
# $ a : chr  "A" "B" "C" "D"