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

Mar*_*pov 10 r data.table

我想知道给定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
Run Code Online (Sandbox Code Playgroud)

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

   out
1:   2
2:   4
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jos*_*ien 14

请改用:

DT[(bmask), .(out=number)]
#    out
# 1:   2
# 2:   4
Run Code Online (Sandbox Code Playgroud)

括号的作用是将符号bmask放在函数调用中,从其评估环境DT中将显示该列的列1.任何其他函数调用只返回其bmask值(例如c(bmask),I(bmask)bmask==TRUE)或其真实元素的索引(例如which(bmask))将同样有效,但可能需要稍长的时间来计算.

如果bmask设一个函数调用中,它将在呼叫范围(这里的全球环境),也可以是在方便的时间来搜索.以下是相关的解释?data.table:

高级:当'i'是单个变量名时,它不被视为列名的表达式,而是在调用范围中进行评估.


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