根据给定的列名称,更新data.table可行或不起作用

时间:2014-04-04 15:24:49

标签: r data.table

嗯,我觉得这里有点傻。我显然遗漏了一些东西,但我无法弄清楚是什么。 根据我在初始化和更新data.table时提供的列名,它可以工作或不工作:

library('data.table')
n.rows <- 2L
dx <- 10L
dy <- 10L

dt1 <- data.table(dx = integer(n.rows), dy = integer(n.rows))
dt1[1, c('dx', 'dy') := list(dx, dy)]

这不会更新第1行,实际上它似乎什么都不做(没有警告):

> dt1
   dx dy
1:  0  0
2:  0  0

将列名从“dx”和“dy”更改为“val.dx”和“val.dy”之后,它按预期工作:

dt2 <- data.table(val.dx = integer(n.rows), val.dy = integer(n.rows))
dt2[1, c('val.dx', 'val.dy') := list(dx, dy)]

> dt2
   val.dx val.dy
1:     10     10
2:      0      0

发生了什么事?我也试过= FALSE,但是 - 正如预期的那样?set - 那是不成功的。我不知道的列名是否有限制?

1 个答案:

答案 0 :(得分:2)

你的困惑是关于范围界定。 j - 表达式的范围是 data.table本身,因此当您编写list(dx, dy)时,与编写list(dt1$dx, dt1$dy)相同,这是为什么你得到这些结果。

如果您坚持使用相同的名称,则可以使用eval来评估全局范围内的变量:

dt1[1, c('dx', 'dy') := list(eval(dx, .GlobalEnv), eval(dy, .GlobalEnv))]
dt1
#   dx dy
#1: 10 10
#2:  0  0