为何向data.table添加新列后,已获取的列名向量n会被修改?
data.table列名向量被意外修改的原因
这是因为data.table的names()方法返回的是对列名内部存储的引用,而非独立副本。
你给出的代码里,执行n <- names(d)时,n并没有生成一个全新的列名字符向量,而是直接指向了data.table对象d内部管理列名的内存地址。之后用d[,c:=3,]给d添加新列时,data.table会直接修改这个内部的列名存储(这也是它高效性的核心特性之一——按引用修改数据),所以作为内部存储引用的n,自然就跟着变成更新后的列名了。
如果要避免这种情况,你需要显式创建列名的独立副本,比如用:
n <- copy(names(d)) # 或者 n <- as.character(names(d))
这样n就是完全独立的向量,不会再随d的列名变化而改变。
内容的提问来源于stack exchange,提问作者Funkwecker
相关产品推荐
相关产品推荐

