В data.table
возможно иметь столбцы типа list
, и я впервые пытаюсь воспользоваться этой функцией. Мне нужно сохранить для каждой строки таблицы dt
несколько комментариев, взятых из веб-службы rApache. Каждый комментарий будет иметь имя пользователя, дату и время.
Вместо того, чтобы использовать длинные строки с каким-то странным необычным персонажем, чтобы отделить каждое сообщение от других (например, |
) и ;
, чтобы отделить каждый элемент комментария, я подумал использовать списки, подобные этому:
library(data.table)
dt <- data.table(id=1:2, comment=list(list(list(username="michele", date=Sys.time(), message="hello"),
list(username="michele", date=Sys.time(), message="world")),
list(list(username="michele", date=Sys.time(), message="hello"),
list(username="michele", date=Sys.time(), message="world"))))
> dt
id comment
1: 1 <list>
2: 2 <list>
чтобы сохранить все комментарии, добавленные для одной конкретной строки. (также потому, что будет легче конвертировать в JSON
позже, когда мне нужно будет отправить его обратно в интерфейс)
Однако, когда я пытаюсь моделировать, как я буду фактически заполнять свою таблицу во время производства (добавив один комментарий к определенной строке), R
либо сбой, либо не присваивает то, что я хотел бы, а затем сбой:
library(data.table)
> library(data.table)
> dt <- data.table(id=1:2, comment=vector(mode="list", length=2))
> dt$comment
[[1]]
NULL
[[2]]
NULL
> dt[1L, comment := 1] # this works
> dt$comment
[[1]]
[1] 1
[[2]]
NULL
> set(dt, 1L, "comment", list(1, "a")) # assign only `1` and when I try to see `dt` R crashes
Warning message:
In set(dt, 1L, "comment", list(1, "a")) :
Supplied 2 items to be assigned to 1 items of column 'comment' (1 unused)
> dt[1L, comment := list(1, "a")] # R crashes as soon as I run
> dt[1L, comment := list(list(1, "a"))] # any of these two
Я знаю, что пытаюсь неправильно использовать data.table
, например. способ, которым был разработан аргумент j
, позволяет это:
dt[1L, c("id", "comment") := list(1, "a")] # lists in RHS are seen as different columns! not parts of one
Вопрос: Итак, есть ли способ выполнить задание, которое я хочу? Или мне просто нужно взять dt$comment
в переменную, изменить ее, а затем повторно назначить весь столбец каждый раз, когда мне нужно сделать обновление?