R 为什么data.table在函数中保留对colnames的更改?
我注意到data.tables的这种有趣行为: 我创建了一个新的data.table,并使用一个函数对其进行修改,并使用R 为什么data.table在函数中保留对colnames的更改?,r,data.table,R,Data.table,我注意到data.tables的这种有趣行为: 我创建了一个新的data.table,并使用一个函数对其进行修改,并使用setnames更改colnames。在此最小示例中,仅使用setnames将“B”更改为“C”: dt1 <- data.table( A=c(1:5), B=c(6:10)) dt1 > dt1 > A B > 1: 1 6 > 2: 2 7 > 3: 3 8 > 4: 4 9 > 5: 5 1
setnames
更改colnames。在此最小示例中,仅使用setnames
将“B”更改为“C”:
dt1 <- data.table(
A=c(1:5),
B=c(6:10))
dt1
> dt1
> A B
> 1: 1 6
> 2: 2 7
> 3: 3 8
> 4: 4 9
> 5: 5 10
doSomething <- function(dt){
setnames(dt, "B", "C")
}
dt2 <- doSomething(dt1)
dt2
> dt2
> A C
> 1: 1 6
> 2: 2 7
> 3: 3 8
> 4: 4 9
> 5: 5 10
函数dt1之后还有一个更改的colname“C”。我知道data.tables的工作方式与data.frames不完全相同,因为在某些操作之后,它们不会分配给创建“重复项”的新对象。但是,在这种情况下,会指定一个新对象,并且操作后旧对象仍会更改。它让人想起了python
这是按预期工作还是我应该报告它有错误?还有,有没有办法改变这种行为?我希望在对dt1应用一个带有集合名的函数之后保持dt1的完整性
干杯您可以复制原始数据集(“dt1”)的
副本,然后尝试doSomething(dt1)
,它只会更改“dt1”
dt2 <- copy(dt1)
doSomething(dt1)
colnames(dt1)
#[1] "A" "C"
colnames(dt2)
#[1] "A" "B"
dt2如果您想保留原始名称dt2,这是一个常见问题解答。请务必阅读软件包的小插曲,特别是。@akrun请将您的评论添加为anwser,以便我可以接受。@Roland,很公平。在?setnames
中也提到了它,但在常见问题解答中很难找到它(至少对我来说)。供将来参考,请参见第3b节。
dt2 <- copy(dt1)
doSomething(dt1)
colnames(dt1)
#[1] "A" "C"
colnames(dt2)
#[1] "A" "B"