R data.table 列名的保留字?

Reserved words for R data.table column names?

我在 data.table 中发现了一些关于特定列名称的尖锐边缘。我怎样才能避免被它们割伤自己?假设我有一个包含两列的 data.table,'type' 和 'value'。

numRows = 100
numTypes = 10
dt = data.table(type=sample(numTypes, numRows, replace=T),
                value=rnorm(numRows))

如果我想快速计算所有类型为 3 的行的平均值,这很有效:

dt[type==3, mean(value)]
# [1] 0.08086124

但是如果 "someone who is not me" 出现并认为 'type' 是一个糟糕的列名称,它真的应该是 'class' 怎么办?

setnames(dt, "type", "class")

现在,当我尝试等效操作时,我收到可怕的错误消息:

dt[class==3, mean(value)]
# Error in setattr(attr(x, "index"), paste(cols, collapse = "__"), o) : 
#  attempt to set invalid 'class' attribute

这是预期的行为(对于 OSX 上的 1.9.4)?我认为它发生是因为 'class' 是 R 中的函数名称,而 data.table 内部的某些东西正在这样解释它。将 i 子句括在括号中似乎可以解决问题:

dt[(class==3), mean(value)]
# [1] 0.08086124

但也许在某些情况下此解决方法也会失败?

是否有在这种情况下预计会失败的列名列表?

用户定义的函数或加载的库会导致同样的错误吗?

通常有没有我应该使用的更安全的方法?

这似乎已经修复了。更新您的 data.table 软件包。

library(data.table)
set.seed(1)
numRows = 100
numTypes = 10
dt = data.table(type=sample(numTypes, numRows, replace=T),
                value=rnorm(numRows))
setnames(dt,"type","class")
dt[class==3, mean(value)]
# [1] -0.2300146