如何以编程方式在data.table中添加未知列?
FAQ州的第1节:第6节:
要创建表达式,请使用quote()函数。我们将这些称为quote() - 要保存的表达式 与用于创建字符向量的双引号混淆,例如c(“x”)。最简单的 quote() - ed表达式只是一个列名:
但我似乎没有正确地做到这一点:
function a() {
this.name = 'test';
}
function b() {
this.age = 33;
return new a();
}
var p = new b();
console.log(p); // a { name = 'test'}
我想要的是:
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
答案 0 :(得分:5)
你需要一个引用的表达式,但是你不能总是通过调用quote()
获得一个。 quote()
内没有变量评估。你可以用
forms_exp3 <- parse(text=forms_exp)[[1]]
counts[, formal := eval(forms_exp3)]
这里我们使用parse()
从文本中创建语言元素。 parse()
将返回一个表达式(有点像语言对象的列表),所以我们只想返回第一个语言对象。比较
str(forms_exp)
# chr "u + v + w"
str(forms_exp2)
# symbol forms_exp
str(forms_exp3)
# language u + v + w