R 我是否需要对函数中的data.table对象使用copy()?
我是否需要在函数中使用copy(),以避免对input data.table进行不必要的修改 比如说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的链接答案确实解释了回答您问题的所有细节 示例函数的此(修
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"