我觉得这里有点蠢。我显然错过了什么,但我想不出是什么。根据初始化和更新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到底怎么回事?我也尝试过with=FALSE,但是--就像预期的那样--这并不成功。我不知道的列名有什么限制吗?
发布于 2014-04-04 15:37:01
你的困惑是关于范围的界定。j-expression的范围在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 0https://stackoverflow.com/questions/22866847
复制相似问题