为什么 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"
我注意到 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"