为什么 data.table 在一个函数中保留对 colnames 的更改?

Why is data.table keeping changes to colnames done within a function?

我注意到 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 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 不完全相同,因为在某些操作之后,它们不会分配给创建 "duplicates" 的新对象。然而,在这种情况下,一个新对象被分配,并且旧对象在操作后仍然发生变化。它以某种方式让人想起 python.

这是按预期工作还是我应该报告它有错误?另外,有没有办法改变这种行为?我想在应用一个带有 setnames 的函数后保持 dt1 完好无损。

干杯

您可以对原始数据集 ('dt1') 进行 copy,然后尝试 doSomething(dt1),这只会改变 'dt1'

dt2 <- copy(dt1)
doSomething(dt1) 

colnames(dt1)
#[1] "A" "C"
colnames(dt2)
#[1] "A" "B"