Подтвердить что ты не робот

Как вывести список в файл в R

Предположим, что у вас есть список книг с авторами, после прочтения данных в списке "LS" я попытался ввести его в файл, а результат был

> write.table(LS, "output.txt")
Error in data.frame(..., title = NULL,  : 
  arguments imply differing number of rows: 1, 0

> write(LS, "output.txt")
Error in cat(list(...), file, sep, fill, labels, append) : 
  argument 1 (type 'list') cannot be handled by 'cat'

Мне удалось использовать dput, но я бы хотел, чтобы данные были отформатированы хорошо (без избыточности повторяющихся ключевых слов по всему файлу). Какие-либо предложения? Благодаря

UPDATE dput (head (LS, 2))

list(structure(list( title = "Book 1", 
authors = list(structure(c("Pooja", "Garg"),
 .Names = c("forename","surname")), 
structure(c("Renu", "Rastogi"), 
.Names = c("forename","surname")))),
 .Names = c("title", "authors")), 

structure(list( title = "Book 2", 
 authors = list(structure(c("Barry", "Smit"), .Names = c("forename", 
    "surname")), structure(c("Tom", "Johnston"), .Names = c("forename", 
    "surname")))), .Names = c("title", "authors")))
4b9b3361

Ответ 1

Вы можете сначала преобразовать свой список в кадр данных:

LS.df = as.data.frame(do.call(rbind, LS))

или

LS.df = as.data.frame(do.call(cbind, LS))

Затем вы можете просто сохранить LS.df с помощью write.csv или write.table

Ответ 2

Используя предоставленные вами данные и rjson

library(rjson)

# write them to a file
cat(toJSON(LS), file = 'LS.json')


LS2 <- fromJSON('LS.json')


# some rearranging to get authors back to being a data.frame

LS3 <- lapply(LS2, function(x) { x[['authors']] <-  lapply(x[['authors']], unlist); x})

identical(LS, LS3)

## TRUE

Файл выглядит как

[{"title":"Book 1","authors":[{"forename":"Pooja","surname":"Garg"},{"forename":"Renu","surname":"Rastogi"}]},{"title":"Book 2","authors":[{"forename":"Barry","surname":"Smit"},{"forename":"Tom","surname":"Johnston"}]}]

, если вы хотите, чтобы каждая книга была отдельной строкой, вы можете использовать

.json <-  lapply(LS, toJSON)
# add new lines and braces

.json2 <- paste0('[\n', paste0(.json, collapse = ', \n'), '\n]')
 cat(.json)
[
{"title":"Book 1","authors":[{"forename":"Pooja","surname":"Garg"},{"forename":"Renu","surname":"Rastogi"}]}, 
{"title":"Book 2","authors":[{"forename":"Barry","surname":"Smit"},{"forename":"Tom","surname":"Johnston"}]}
]

Ответ 3

Я использую пакет RJSONIO.

library(RJSONIO)

exportJSON <- toJSON(LS)
write(exportJSON,"LS.json")

Ответ 4

Лучше использовать формат()

LS.str <- format(LS)