首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据给定的列名,更新data.table有效或不工作

根据给定的列名,更新data.table有效或不工作
EN

Stack Overflow用户
提问于 2014-04-04 15:24:49
回答 1查看 48关注 0票数 2

我觉得这里有点蠢。我显然错过了什么,但我想不出是什么。根据初始化和更新data.table时给出的列名,它可以工作还是不工作:

代码语言:javascript
复制
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行,实际上它似乎什么也不做(没有警告):

代码语言:javascript
复制
> dt1
   dx dy
1:  0  0
2:  0  0

在将列名从“dx”和“dy”更改为“val.dx”和“val.dy”之后,它的工作原理是:

代码语言:javascript
复制
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,但是--就像预期的那样--这并不成功。我不知道的列名有什么限制吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-04 15:37:01

你的困惑是关于范围的界定。j-expression的范围在data.table本身,所以当您编写list(dx, dy)时,这与编写list(dt1$dx, dt1$dy)是一样的,这就是为什么要获得这些结果。

如果坚持使用相同的名称,可以使用eval计算全局范围中的变量:

代码语言:javascript
复制
dt1[1, c('dx', 'dy') := list(eval(dx, .GlobalEnv), eval(dy, .GlobalEnv))]
dt1
#   dx dy
#1: 10 10
#2:  0  0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22866847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档