如何以编程方式在data.table中添加未知列?
FAQ的第1:6节说明:
要创建表达式,请使用quote()函数.我们将这些称为quote() - ed表达式,以避免与用于创建字符向量(如c("x")的双引号混淆.最简单的quote() - ed表达式只是一个列名:
但我似乎没有正确地做到这一点:
library(data.table)
counts <- as.data.table(data.frame(
u = 1:3,
v = 3:5,
w = 0:2,
x = 3:5,
y = 6:8,
z = 1:3
))
form_nms <- c("t", "u", "v", "w")
forms <- form_nms[form_nms %in% colnames(counts)]
forms_exp <- paste(forms, collapse=" + ")
forms_exp2 <- quote(forms_exp)
counts[, formal := eval(forms_exp2)]
counts[, formal := eval(forms_exp)]
## Both give...
## u v w x y z formal
## 1: 1 3 0 3 6 1 u + v + w
## 2: 2 4 1 4 7 2 u + v + w
## 3: 3 5 2 5 8 3 u + v + w
Run Code Online (Sandbox Code Playgroud)
我想要的是:
## u v w x y z formal
## 1: 1 3 0 3 6 1 4
## 2: 2 4 1 4 7 2 7
## 3: 3 5 2 5 8 3 10
Run Code Online (Sandbox Code Playgroud)
你需要一个带引号的表达式,但你并不总是通过调用得到一个quote().内部没有可变的评价quote().你可以在这里做你想做的事
forms_exp3 <- parse(text=forms_exp)[[1]]
counts[, formal := eval(forms_exp3)]
Run Code Online (Sandbox Code Playgroud)
这里我们用来parse()从文本中创建一个语言元素.parse()将返回一个表达式(有点像语言对象的列表)所以我们只想返回第一个语言对象.相比
str(forms_exp)
# chr "u + v + w"
str(forms_exp2)
# symbol forms_exp
str(forms_exp3)
# language u + v + w
Run Code Online (Sandbox Code Playgroud)