此问题有两种替代解决方案:.. 符号前缀和使用 setkey()。
为了测试,使用了更复杂的样本数据集,其中 a 的值 2 不位于第 2 行:
library(data.table)
d <- data.table(rn = 1:4, a = c(1, 4, 3, 2)) # a more subtle test case
a <- 2
d
rn a
1: 1 1
2: 2 4
3: 3 3
4: 4 2
.. 符号前缀
根据data.table NEWS on version 1.10.2 (Jan 2017):
当j 是一个以.. 为前缀的符号时,它将在调用中查找
范围及其值被视为列名或数字。
不幸的是,这目前仅适用于j= 参数,但不适用于i= 参数。 (根据data.table NEWS on version 1.11.0, May 2018, new features item 18,这可能会扩展到出现在i= 和by= 中的符号。)
但是,我们可以使用它来创建逻辑值向量或索引向量,可用于后续子集:
library(magrittr)
d[, a == ..a] %>% d[.]
rn a
1: 4 2
或
d[, .I[a == ..a]] %>% d[.]
rn a
1: 4 2
对于子集,magrittr 样式 管道 用作 .. 符号前缀尚未实现以在 i= 中使用。因此,直接使用d[, a == ..a] 作为i= 参数,即d[i = d[, a == ..a]] 将不起作用(它返回d unsubsetted)。
setkey()
对于通过局部变量 a、setkey() 过滤 d 的不太常见的用例
可以使用:
setkey(d, a)
d[a]
rn a
1: 4 2
get("a", pos = 1L)
get("a", pos = 1L)] 或更短的get("a", 1L) 是get("a", envir=parent.frame() 的缩写,在r2evans' answer 中已经提出。
get("a", 1L) 在某种程度上等同于..a,但更健壮,因为它可以直接在i= 中使用:
d[a == get("a", 1L)]
rn a
1: 4 2