我注意到了data.tables的这个有趣的行为:
我创建了一个新的data.table并使用函数对其执行某些操作并使用setnames
更改列名。在这个最小的例子中,只有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:
dt1
> dt1
> 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。
这是按预期工作还是我应该报告它有错误?另外,有没有办法改变这种行为?在将一个带有setnames的函数应用到它之后,我想保持dt1完好无损。
干杯
答案 0 :(得分:1)
您可以制作copy
原始数据集(&#39; dt1&#39;),然后尝试doSomething(dt1)
,这只会更改&#39; dt1&#39;
dt2 <- copy(dt1)
doSomething(dt1)
colnames(dt1)
#[1] "A" "C"
colnames(dt2)
#[1] "A" "B"