我经常发现自己在:=
同一个数据表上使用一长串链式计算。例如,像这样
test = data.table(1:10, 1:10, 1:10, 1:10)
test[, V1 := V1^2]
test[, V2 := V1*V2]
test[, V3 := V2/V3]
test[, V4 := sqrt(V3)]
test[, new := letters[V4]]
必须在每一行上写test[, ...]
1) 需要更长的时间来输入(这不是我能应付的大问题)。但是,更重要的是,它也会在视觉上分散计算的流程和内容。我宁愿写类似的东西
test[, {
V1 := V1^2
V2 := V1*V2
V3 := V2/V3
V4 := sqrt(V3)
new := letters[V4]
}]
但这会引发错误You have wrapped := with {} which is ok but then := must be the only thing inside {}
。
我知道我会写
within(test, {
V1 = V1^2
V2 = V1*V2
V3 = V2/V3
V4 = sqrt(V3)
new = letters[V4]
})
但这失去了使用的效率:=
我尝试编写一个函数来提供这种能力
with.dt = function(dt, expressions){
e = strsplit(expressions,'\n')
for (i in 1:length(e)){
dt[, eval(parse(text = e[i]))]
}
dt
}
with.dt(test, "
V1 := V1^2;
V2 := V1*V2;
V3 := V2/V3;
V4 := sqrt(V3);
new := letters[V4];
")
但这不会改变 data.table 的内容
是否有任何语法允许within
版本的整洁外观,同时保留按引用分配的属性:=
?