在data.table中的j表达式中使用..col

我在最新版本的data.table中从..j语法中获取所需行为时遇到问题,当我想使用列范围中的变量查询列时,然后操纵该变量.举例来说,这是一个表:

A <- data.table(myValA = c(6,23,7,2,5), myValB = c(43,12,7,89,2))
valA <- "myValA"
valB <- "myValB"

我想通过两列的元素产品获取元素:

A[, myValA * myValB]

[1] 258 276  49 178  10

但是我想通过引用来调用列,使用调用范围中的变量valA和valB.要简单地访问变量,..valA语法工作正常.

A[, ..valA]

   myValA
1:      6
2:     23
3:      7
4:      2
5:      5

同样适用于..valB.但是当我尝试将j中的两列相乘时,使用old with = False样式或新的.j style命令,我得到错误:

A[, ..valA * ..valB]
Error in eval(jsub, SDenv, parent.frame()) : object '..valA' not found

A[, valA * valB, with = FALSE]
Error in valA * valB : non-numeric argument to binary operator

我在这里错过了什么?

更新:

我已经掌握了解决这个问题的一些合适的方法(为下面的akrun欢呼),但我也试图更多地了解为什么这不起作用.至少,我对语法的理解没有让我明白为什么不应该这样做.

最佳答案 我们可以在.SDcols中指定,然后使用Reduce进行元素乘法

A[, Reduce(`*`, .SD), .SDcols = c(valA, valB)]
#[1] 258 276  49 178  10

或者不是有两个对象,而是创建一个对象

v1 <- c(valA, valB)
A[,  ..v1][, do.call(`*`, .SD)]
#[1] 258 276  49 178  10

或者我们可以单独评估并繁殖

(A[, ..valA] * A[, ..valB])[[1]]
#[1] 258 276  49 178  10
点赞