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(`(`)
.
我想知道为什么给定 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(`(`)
.