r - 在 R data.table 中初始化和复制列表列
问题描述
我经常需要存储复杂的对象,data.table
所以我经常使用列表列。有时我需要用空列表初始化列,有时我需要将列表列复制到另一列。
起初这些似乎没有错:
# the example at https://stackoverflow.com/a/22536321/3718827
dt = data.table(id = 1:2, comment = vector("list", 2L))
# my usage need to add column to existing dt, not creating a data.table from scratch, so I modified it a little bit
dt <- data.table(id = 1:2)
dt[, comment := vector("list", nrow(dt))]
dt[1, comment := .(list(list(a = "a", b = "b")))]
dt[, edited_comment := comment]
但是,如果只有一行,则上面的代码不再起作用
> dt <- data.table(id = 1)
> dt[, comment := vector("list", nrow(dt))]
Warning message:
In `[.data.table`(dt, , `:=`(comment, vector("list", nrow(dt)))) :
Adding new column 'comment' then assigning NULL (deleting it).
> dt[1, comment := .(list(list(a = "a", b = "b")))]
> dt[, edited_comment := comment]
Warning message:
In `[.data.table`(dt, , `:=`(edited_comment, comment)) :
Supplied 2 items to be assigned to 1 items of column 'edited_comment' (1 unused)
我尝试了不同的语法,这似乎有效
> dt <- data.table(id = 1)
> dt[, comment := .(list(NULL))]
> dt[1, comment := .(list(list(a = "a", b = "b")))]
> dt[, edited_comment := list(comment)]
对于列表列初始化,也许我找到的示例代码仅用于data.table()
调用。要添加列,则不应使用它。
对于复制一列,这种行为是可以理解的,但当它使用 nrow > 1 但不使用 nrow = 1 时有点令人惊讶。
我的问题是,该任务的正确语法是什么?
对于第一个版本的 nrow >1/=1 令人惊讶的行为差异,这是预期的行为还是错误?
解决方案
推荐阅读
- rust - 如何在编译时将 ToString 值转换为 &str?
- go - 为什么用指针分配接口然后地址在Golang中显示不同的行为
- ruby-on-rails - 更改作为参数接收的嵌套键的名称
- scala - kafka 流应用程序仅在应用程序被杀死时打印
- python - 平均大型 csv 文件
- mysql - 将 int 添加到日期 SQL
- javascript - 在wordpress中隐藏标签
- php - Wordpress:我应该使用函数还是全局变量?
- swift - 如何在 MKMapView 中查找绘制形状的半径
- javascript - 如何使用 javascript 在 web 中使用登录用户在 firebase 中创建用户?