考虑这个简单的例子
mytib <- tibble(a = c(1,2,3),
text = c('a','b','c'))
# A tibble: 3 x 2
a text
<dbl> <chr>
1 1 a
2 2 b
3 3 c
现在,我需要使用一些神奇的data.table
函数,因此我使用data.table
转换为setDT()
似乎可以正常工作:
mytib %>% setDT()
> mytib
a text
1: 1 a
2: 2 b
3: 3 c
但是现在通过引用创建新列会触发此疯狂的错误消息。
> mytib[, newcol := text]
警告消息:在
[.data.table
(mytib,,:=
(newcol,文本)中):
无效的.internal.selfref已检测到并已通过(浅)进行了修复 data.table的副本,以便:=可以通过添加此新列 参考。之前,此data.table已由R复制 (或使用structure()或类似方法手动创建)。避免键<-, 名称<-和attr <-,其中R当前(奇怪地)可以复制整个 数据表请改用set *语法以避免复制:?set,?setnames 和setattr。如果此消息无济于事,请报告您的使用情况 data.table问题跟踪器的大小写,以便可以解决根本原因或 此消息得到改善。
我应该担心吗? 谢谢!
答案 0 :(得分:1)
有点奇怪-可能与转换有关,也可能是错误。
经过一些测试,看来这仅在转换后第一次要修改data.table时发生。
mytib <- tibble(a = c(1,2,3),
text = c('a','b','c'))
mytib %>% setDT()
mytib[,newcol := text] # add initially - causes a warning, but still completes
mytib[,newcol := NULL] # removes fine
mytib[,newcol := text] # works fine - no error
由于结果返回正常并且随后不发出任何警告,因此它很可能是可忽略的。
请注意,无论您要从什么进行转换(列表,数据框或小标题),也无论您是复制已存在的列还是创建一个全新的列,此错误似乎都会发生。
答案 1 :(得分:1)
为什么不直接调用'setDT'函数而不是使用“%>%”运算符?这可能与它有关,因为“ data.table”使用“引用”来访问数据,这可能会导致问题。我只是直接通过电话尝试了一下,效果很好:
> library(data.table)
> library(tidyverse)
> mytib <- tibble(a = c(1,2,3),
+ text = c('a','b','c'))
> setDT(mytib)
> mytib[, newcol := 'text']
>