为什么data.table会在函数内保持对colnames的更改?

时间:2015-03-03 16:37:21

标签: r data.table

我注意到了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完好无损。

干杯

1 个答案:

答案 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"