来自`data.table`包的`setDT`出错

时间:2014-04-29 09:44:31

标签: r data.table environment

每当您尝试在setDT包中的存储数据上运行时,datasets似乎都会返回错误。例如

library(data.table)
setDT(CO2)

## Error in assign(name, x, parent.frame(), inherits = TRUE) : 
##   cannot change value of locked binding for 'CO2'

最顽固的是,如果你重新运行setDT(CO2),它将会起作用

所以我查看了setDT的源代码并尝试重现错误

x <- CO2
name <- as.character(substitute(x))
assign(name, x, parent.frame(), inherits = TRUE)

哪个有效并且没有返回任何错误。我的猜测是parent.frame()是引起它的那个,但我不知道自己是什么时候回到舞台上。另外,我无法理解为什么setDT(CO2)在第二次运行时没有返回错误。

我的sessionInfo()

## R version 3.0.3 (2014-03-06)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## 
## locale:
##   [1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
## [4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    
## 
## attached base packages:
##   [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##   [1] data.table_1.9.2
## 
## loaded via a namespace (and not attached):
##   [1] plyr_1.8       reshape2_1.2.2 stringr_0.6.2  tools_3.0.3   

1 个答案:

答案 0 :(得分:1)

使用commit 1320setDT现在返回一个友好错误,当绑定被锁定时,无法通过引用修改对象。来自NEWS,No:37的1.9.3错误修复:

  

setDT现在提供了一个友好的错误,当尝试通过引用将变量更改为data.table时,其绑定被锁定(通常当变量在包中时,例如:CO2)。关闭#475。感谢David Arenburg在SO上提交报告here