Используя data.table и RJSONIO / jsonlite - результаты переносятся

Я реализовал часть библиотеки оболочки для htmlwidgets rstudio, которая отображает сводную таблицу. Пакет находится здесь.

Пакет хорошо работает с data.tables и data.frame (как и должно!). Например, это работает с радужной оболочкой. С другой стороны, если я попытаюсь преобразовать iris в data.table, мой пакет (на самом деле htmlwidgets - который внутренне использует RJSONIO) выдает ошибку.

Я знаю, что это кажется запутанным, но вы можете воспроизвести ошибку, просто проверив разницу между следующими кодами:

library(data.table)
library(RJSONIO)
data.table(fromJSON(toJSON(data.table(iris))))

Результат отличается от набора данных дорогой радужной оболочки глаза:

                                           V1
1:                   5.1,4.9,4.7,4.6,5.0,5.4,
2:                   3.5,3.0,3.2,3.1,3.6,3.9,
3:                   1.4,1.4,1.3,1.5,1.4,1.7,
4:                   0.2,0.2,0.2,0.2,0.2,0.4,
5: setosa,setosa,setosa,setosa,setosa,setosa,

С другой стороны, jsonlite может правильно перестроить радужную оболочку (просто не забудьте отключить RJSONIO перед запуском кода):

    library(data.table)
    library(jsonlite)
    data.table(fromJSON(toJSON(data.table(iris))))

     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
  1:          5.1         3.5          1.4         0.2    setosa
  2:          4.9         3.0          1.4         0.2    setosa
  3:          4.7         3.2          1.3         0.2    setosa
  4:          4.6         3.1          1.5         0.2    setosa
  5:          5.0         3.6          1.4         0.2    setosa

Я не уверен, связана ли проблема с data.table или RJSONIO ...


person Enzo    schedule 06.02.2015    source источник


Ответы (1)


Это не связано с json.
RJSONIO::fromJSON возвращает list, а jsonlite::fromJSON возвращает data.frame.
Это связано с data.table вызовом list, который отличается от вызова data.frame, но по-прежнему ведет себя должным образом.
Попробуйте as.data.table вместо data.table во внешнем вызове.

as.data.table(fromJSON(toJSON(data.table(iris))))

Это уже обсуждалось на data.table github. Я ответил на ваш вопрос ссылкой на обсуждение.

person jangorecki    schedule 06.02.2015
comment
Я принял ваше решение, поскольку оно решает вопрос. С другой стороны, у меня все еще есть ошибка в моем пакете, когда я использую точку в имени столбца (например, data.table (iris) - или as.data.table (iris)), вероятно, из-за преобразования RJSONIO. См. Мой комментарий на github. - person Enzo; 09.02.2015
comment
Предложение, которое вы разместили на github, верное: data.table 1.9.5 устраняет проблему с точкой !! - person Enzo; 09.02.2015