Как напечатать первые десять строк файла JSON в R
У меня есть R dataframe и преобразовал его в формат json с помощью пакета jsonlite
jsonData <- toJSON(dataset)
Я хочу проверить, если преобразование прошло успешно, набор данных очень большой. Как мне распечатать первые 5 строк в файле json?
1 ответ
Преобразование объектов R в JSON
Есть несколько пакетов, которые реализуют toJSON()
функция, например, jsonlite
, rjson
, а также RJSONIO
, я использую jsonlite
В следующих. Решение также работает с RJSONIO
, но не с rjson
,
Я не нашел прямой способ напечатать только подмножество строк из строки JSON. Причина в том, что все три пакета возвращают один символ (т. Е. Символьный вектор длины один), а не символьный вектор, где каждая строка строки JSON занимает один элемент:
length(jsonlite::toJSON(mtcars))
Действительно, преобразованный объект представляет собой одну длинную строку текста:
jsonlite::toJSON(mtcars)
## [{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3.9,"wt":2.62,"qsec":16.46,"vs":0,"am":1,"gear":4,"carb":4,"_row":"Mazda RX4"},{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3.9,"wt":2.875,"qsec":17.02,"vs":0,"am":1,"gear":4,"carb":4,"_row":"Mazda RX4 Wag"},{"mpg":22.8,"cyl":4,"disp":108,"hp":93,"drat":3.85,"wt":2.32,"qsec":18.61,"vs":1,"am":1,"gear":4,"carb":1,"_row":"Datsun 710"},{"mpg":21.4,"cyl":6,"disp":258,"hp":110,"drat":3.08,"wt":3.215,"qsec":19.44,"vs":1,"am":0,"gear":3,"carb":1,"_row":"Hornet 4 Drive"},{"mpg":18.7,"cyl":8,"disp":360,"hp":175,"drat":3.15,"wt":3.44,"qsec":17.02,"vs":0,"am":0,"gear":3,"carb":2,"_row":"Hornet Sportabout"},{"mpg":18.1,"cyl":6,"disp":225,"hp":105,"drat":2.76,"wt":3.46,"qsec":20.22,"vs":1,"am":0,"gear":3,"carb":1,"_row":"Valiant"},{"mpg":14.3,"cyl":8,"disp":360,"hp":245,"drat":3.21,"wt":3.57,"qsec":15.84,"vs":0,"am":0,"gear":3,"carb":4,"_row":"Duster 360"},{"mpg":24.4,"cyl":4,"disp":146.7,"hp":62,"drat":3.69,"wt":3.19,"qsec":20,"vs":1,"am":0,"gear":4,"c... <truncated>
Поскольку есть только одна строка, вы, очевидно, ничего не получите, печатая только первые несколько строк.
Но функция toJSON
от jsonlite
(и тот из RJSONIO
) позволяет разбить строку JSON на строки (я обрезал вывод вручную, потому что он слишком длинный):
jsonlite::toJSON(mtcars, pretty = TRUE)
## [
## {
## "mpg": 21,
## "cyl": 6,
## "disp": 160,
## "hp": 110,
## "drat": 3.9,
## "wt": 2.62,
## ...
Это по-прежнему символьный вектор длины один, но теперь строки разделены переносами строк (\n
), которая может быть использована для достижения вашей цели:
length(jsonlite::toJSON(mtcars, pretty = TRUE))
## [1] 1
as.character(jsonlite::toJSON(mtcars, pretty = TRUE))
## [1] "[\n {\n \"mpg\": 21,\n \"cyl\": 6,\n \"disp\": 160,\n \"hp\": 110,\n \"drat\": 3.9,\n \"wt\": 2.62,\n \"qsec\": 16.46,\n \"vs\": 0,\n \"am\": 1,\n \"gear\": 4,\n \"carb\": 4,\n \"_row\": \"Mazda RX4\"\n },\n {\n \"mpg\": 21,\n \"cyl\": 6,\n \"disp\": 160,\n \"hp\": 110,\n \"drat\": 3.9,\n \"wt\": 2.875,\n \"qsec\": 17.02,\n \"vs\": 0,\n \"am\": 1,\n \"gear\": 4,\n \"carb\": 4,\n \"_row\": \"Mazda RX4 Wag\"\n },\n {\n \"mpg\": 22.8,\n \"cyl\": 4,\n \"disp\": 108,\n \"hp\": 93,\n \"drat\": 3.85,\n \"wt\": 2.32,\n \"qsec\": 18.61,\n \"vs\": 1,\n \"am\": 1,\n \"gear\": 4,\n \"carb\": 1,\n \"_row\": \"Datsun 710\"\n },\n {\n \"mpg\": 21.4,\n \"cyl\": 6,\n \"disp\": 258,\n \"hp\": 110,\n \"drat\": 3.08,\n \"wt\": 3.215,\n \"qsec\": 19.44,\n \"vs\": 1,\n \"am\": 0,\n \"gear\": 3,\n \"carb\": 1,\n \"_row\": \"Hornet 4 Drive\"\n },\n {\n ... <truncated>
Печать только подмножества строк из JSON
Я написал небольшую функцию, которая принимает объект JSON в качестве входных данных и печатает подмножество его строк. Это работает только если вы используете pretty = TRUE
при создании объекта JSON. Вот:
print_json_lines <- function(json, lines) {
# break up into lines
json_lines <- strsplit(json, "\n")[[1]]
# get desired lines
json_lines <- json_lines[lines]
# print
cat(paste(json_lines, collapse = "\n"))
# return invisily
invisible(json_lines)
}
Оно использует strsplit()
разбить строку на вектор символов, по одной записи на строку. Тогда можно выбрать строки обычным индексированием с помощью []
, Поскольку простая печать символьного вектора, скорее всего, напечатает несколько строк символов в одной строке, я снова объединю подмножество строк в одну строку (с paste()
) и разделить строки \n
, Это приводит к красиво отформатированному выводу:
print_json_lines(jsonlite::toJSON(mtcars, pretty = TRUE), 1:5)
## [
## {
## "mpg": 21,
## "cyl": 6,
## "disp": 160,
Замечание о разных пакетах JSON
Как я уже упоминал в начале, это решение работает для обоих, jsonlite
а также RJSONIO
, Причина в том, что они оба позволяют разбить строку JSON на строки с pretty = TRUE
, Тем не менее, вывод выглядит иначе, когда вы используете RJSONIO
, потому что он использует разные соглашения в преобразовании:
print_json_lines(RJSONIO::toJSON(mtcars, pretty = TRUE), 1:5)
## {
## "mpg" : [
## 21,
## 21,
## 22.8,
Функция не работает с rjson
потому что я не знаю, как разделить объект JSON на строки.