我有一个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)
quote()而eval()像其他语言的宏.