将公式列表应用于R data.table

mor*_*fin 3 r data.table

我有一个data.table和一个公式列表,

DT <- data.table(A = c(1:3), B = c(3:1), C = c(4:6), D = (6:4))
l <- list(f1 = "A + B", f2 = "B + C", f3 = "C - D", f4 = "D / A")
Run Code Online (Sandbox Code Playgroud)

这可以通过以下方式实现

DT[, ":="(f1 = A + B, f2 = B + C, f3 = C - D, f4 = D / A)]
Run Code Online (Sandbox Code Playgroud)

要么

for (i in 1:length(l)) {
  DT[, eval(names(l)[i]) := eval(parse(text=l[[i]]))]
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在l不使用循环的情况下使用信息?

# some code
DT
#    A B C D f1 f2 f3       f4
# 1: 1 3 4 6  4  7 -2 6.000000
# 2: 2 2 5 5  4  7  0 2.500000
# 3: 3 1 6 4  4  7  2 1.333333
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 10

如果你是l手工构建,而是像写一样

L = quote(`:=`(f1 = A + B, f2 = B + C, f3 = C - D, f4 = D / A))
Run Code Online (Sandbox Code Playgroud)

那你可以像使用它一样

DT[, eval(L)]

#    A B C D f1 f2 f3       f4
# 1: 1 3 4 6  4  7 -2 6.000000
# 2: 2 2 5 5  4  7  0 2.500000
# 3: 3 1 6 4  4  7  2 1.333333
Run Code Online (Sandbox Code Playgroud)

这是FAQ推荐做法,解释了...

quote()eval()像其他语言的宏.