这是我的意思的一个例子,它使事情变得清晰:
require(data.table)
x = data.table(a=1:10, idx=sample(c(TRUE, FALSE), 10, replace=TRUE))
x[idx]
Error in eval(expr, envir, enclos) : object 'idx' not found
但是,以下工作:
x[idx[]]
#a idx
#1: 2 TRUE
#2: 5 TRUE
#3: 7 TRUE
#4: 9 TRUE
#5: 10 TRUE
知道这里发生了什么吗?
答案 0 :(得分:2)
引用@GSee评论中提供的链接。
您好, 是的预期。来自?data.table: “高级:当我是单个变量名称时,它不被认为是 列名的表达式,而是在调用范围中计算。“ 通过逻辑列进行子集是我能想到的唯一例子 这令人困惑。但是我们非常多地使用这个功能,例如 TMP =列表(...); DT [TMP] 知道DT [TMP]将来如果DT不会开始失败的安全性 有一个名为TMP的列。 当我有一个逻辑列boolCol时,我用():DT [(boolCol)]包装 这避免了内存分配和扫描== TRUE,并避免了 DT的变量名重复[DT $ boolCol] 马修