隐秘的消息从小事到data.table

时间:2019-03-07 20:27:53

标签: r data.table tibble

考虑这个简单的例子

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问题跟踪器的大小写,以便可以解决根本原因或   此消息得到改善。

我应该担心吗? 谢谢!

2 个答案:

答案 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']
>