data.table 使用逻辑列对行进行子集化:为什么我必须明确地与 TRUE 进行比较?

data.table subsetting rows using a logical column: why do I have to explicitly compare with TRUE?

我想知道为什么给定 data.table:

library(data.table)
DT <- structure(list(number = 1:5, bmask = c(FALSE, TRUE, FALSE, TRUE, 
FALSE)), .Names = c("number", "bmask"), row.names = c(NA, -5L
), class = c("data.table", "data.frame"))

> DT
   number bmask
1:      1 FALSE
2:      2  TRUE
3:      3 FALSE
4:      4  TRUE
5:      5 FALSE

表达式 DT[bmask==T,.(out=number)] 按预期工作:

   out
1:   2
2:   4

DT[bmask,.(out=number)] 导致错误:

> DT[bmask,.(out=number)]
Error in eval(expr, envir, enclos) : object 'bmask' not found

这是 data.table 包的正确行为吗?

改用这个:

DT[(bmask), .(out=number)]
#    out
# 1:   2
# 2:   4

圆括号的作用是将符号 bmask 放入函数调用中,在函数调用的计算环境中 DT 的列将可见1。任何其他简单调用 returns bmask 的值(例如 c(bmask)I(bmask)bmask==TRUE)或其真实元素的索引(例如 which(bmask)) 也同样有效,但计算时间可能稍长。

如果bmask 位于函数调用中,它将在调用范围(这里是全局环境)中搜索,这也可以方便地在次。以下是来自?data.table的相关解释:

Advanced: When 'i' is a single variable name, it is not considered an expression of column names and is instead evaluated in calling scope.


1要查看 () 本身就是一个函数调用,请键入 is(`(`).