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 - 那是不成功的。我不知道的列名是否有限制?
答案 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