2012-10-03 21 views
11

Suponga que tiene una lista de libros con autores, después de leer los datos en una lista de "LS" traté de entrar en un archivo y la salida estabaCómo generar una lista para presentar en I

> 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' 

Pude usar dput pero me gustaría que los datos estuvieran formateados bien (sin redundancia de palabras clave repetidas en todo el archivo). ¿Alguna sugerencia? Gracias

ACTUALIZACIÓN dput (cabeza (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"))) 
+1

creo que necesita para comentar por qué usted no cree que la salida de dput es aceptable. ¿Cuál es su salida esperada/deseada? – Dason

+0

@Dason En dput las palabras clave "libro" y "autores" se repetirán en todo el archivo, mientras que las quiero en el encabezado solo como archivos csv. –

+0

colocando algunos datos de ejemplo ayudará (¿qué hay de incluir 'dput (head (LS, 2))' dentro de la pregunta para que podamos ver la estructura de los datos – mnel

Respuesta

9

Es posible convertir primero su lista a una trama de datos:

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

O

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

Entonces usted puede simplemente salvar e LS.df con write.csv o write.table

8

Utilizando los datos que nos ha facilitado y 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 

El archivo se ve como

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

si desea que cada libro en una línea separada luego puede usar

.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"}]} 
] 
+0

Agregué la estructura sobre –

+0

Y ahora he editado la respuesta para trabajar con esta estructura – mnel

+0

Gracias por la solución, pero el marco de datos fue más fácil para mí –

2

Uso el paquete RJSONIO.

library(RJSONIO) 

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

Es mejor utilizar el formato()

LS.str <- format(LS)

Cuestiones relacionadas