我想知道给定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
包的正确行为吗?
答案 0 :(得分:14)
请改用:
DT[(bmask), .(out=number)]
# out
# 1: 2
# 2: 4
括号的作用是将符号bmask
放在函数调用中,从其评估环境中DT
的列将是可见的 1 。任何其他函数调用只返回bmask
的值(例如c(bmask)
,I(bmask)
或bmask==TRUE
)或其真实元素的索引(例如which(bmask)
)也可以工作,但可能需要稍长的时间来计算。
如果bmask
不位于函数调用中,则会在调用范围(此处为全局环境)中搜索它,这有时也很方便。以下是?data.table
的相关解释:
高级:当'i'是单个变量名时,它不是 被认为是列名的表达而是 在通话范围内进行评估。
1 要查看()
本身是函数调用,请键入is(`(`)
。