:=用于数据表中的多个同时分配不尊重更新值。x 列递增,然后我打算将 x 的更新值分配给 y。为什么价值不等于预期?
> z = data.table(x = 1:5, y= 1:5)
> z[, `:=` (x = x + 1, y = x)]
> # Actual
> z
x y
1: 2 1
2: 3 2
3: 4 3
4: 5 4
5: 6 5
> # Expected
> z
x y
1: 2 2
2: 3 3
3: 4 4
4: 5 5
5: 6 6
Run Code Online (Sandbox Code Playgroud)
这里有两个可供您考虑的替代方案。如前所述,data.table不会以那样的方式进行动态范围界定dplyr::mutate,因此y = x仍然z$x在您的陈述的第二部分中引用。如果您非常喜欢这种方式,可以考虑提出问题。
x内联:z[, `:=` (x = (x <- x + 1), y = x)]
Run Code Online (Sandbox Code Playgroud)
在j评估的环境中,现在x创建一个对象来z$x临时覆盖。这应该与dplyr内部所做的非常相似- 评估mutate顺序参数并迭代更新列值。
LHS := RHS表单(参见?set):z[ , c('x', 'y') := {
x = x + 1
.(x, x)
}]
Run Code Online (Sandbox Code Playgroud)
.是data.tablefor 的简写list。在LHS := RHS形式上,RHS必须评估为list; 其中的每一个元素list将是作业中的一列。
更紧凑:
z[ , c('x', 'y') := {x = x + 1; .(x, x)}]
Run Code Online (Sandbox Code Playgroud)
;允许您在同一行上编写多个语句(例如3+4; 4+5will run 3+4then 4+5)。{创建了一种包装多个语句并返回最终值的方法,请参阅?"{"。每当您编写if (x) { do_true } else { do_false }或function(x) { function_body }.
| 归档时间: |
|
| 查看次数: |
54 次 |
| 最近记录: |