data.table使用逻辑列对行进行子集设置:为什么我必须显式地与TRUE进行比较?

data.table使用逻辑列对行进行子集设置:为什么我必须显式地与TRUE进行比较?,r,data.table,R,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:

我想知道为什么对于给定的数据。表:

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,(out=number)]
会导致错误:

> DT[bmask,.(out=number)]
Error in eval(expr, envir, enclos) : object 'bmask' not found
这是
数据的正确行为。表
包?

使用此选项:

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

括号的作用是将符号
bmask
放在函数调用的内部,从函数调用的计算环境中可以看到
DT
的列1。任何其他函数调用,只要返回
bmask
的值(例如
c(bmask)
I(bmask)
、或
bmask==TRUE
)或其真元素的索引(例如
,其中(bmask)
)也同样有效,但计算时间可能稍长

如果
bmask
不位于函数调用中,则将在调用范围(此处为全局环境)中搜索它,这有时也很方便。以下是
?数据表中的相关解释:

高级:当“i”是单个变量名时,它不是 被认为是列名的表达式,而不是 在调用范围中计算


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

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