`:=` 用于数据表中的多个同时赋值不尊重更新值

cry*_*key 1 r data.table

:=用于数据表中的多个同时分配不尊重更新值。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)

Mic*_*ico 5

这里有两个可供您考虑的替代方案。如前所述,data.table不会以那样的方式进行动态范围界定dplyr::mutate,因此y = x仍然z$x在您的陈述的第二部分中引用。如果您非常喜欢这种方式,可以考虑提出问题

  1. 显式分配新的x内联:
z[, `:=` (x = (x <- x + 1), y = x)]
Run Code Online (Sandbox Code Playgroud)

j评估的环境中,现在x创建一个对象来z$x临时覆盖。这应该与dplyr内部所做的非常相似- 评估mutate顺序参数并迭代更新列值。

  1. 切换到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 }.