Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 为什么data.table在函数中保留对colnames的更改?_R_Data.table - Fatal编程技术网

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

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

我注意到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之后还有一个更改的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"