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