Qualcuno ha appena pubblicato alcuni output della console come esempio. (Questo accade molto, e ho delle strategie per convertire l'output di stampa per i vettori e i dataframes.) Mi chiedo se qualcuno ha un metodo elegante per analizzare questo in una vera lista R?Converti l'output della console dell'elenco in un elenco R reale
test <- "[[1]]
[1] 1.0000 1.9643 4.5957
[[2]]
[1] 1.0000 2.2753 3.8589
[[3]]
[1] 1.0000 2.9781 4.5651
[[4]]
[1] 1.0000 2.9320 3.5519
[[5]]
[1] 1.0000 3.5772 2.8560
[[6]]
[1] 1.0000 4.0150 3.1937
[[7]]
[1] 1.0000 3.3814 3.4291"
Questo è un esempio con nodi denominati e senza nome:
L <-
structure(list(a = structure(list(d = 1:2, j = 5:6, o = structure(list(
w = 2, 4), .Names = c("w", ""))), .Names = c("d", "j", "o"
)), b = "c", c = 3:4), .Names = c("a", "b", "c"))
> L
$a
$a$d
[1] 1 2
$a$j
[1] 5 6
$a$o
$a$o$w
[1] 2
$a$o[[2]]
[1] 4
$b
[1] "c"
$c
[1] 3 4
Ho lavorato attraverso il codice di come str
gestisce gli elenchi, ma che sta facendo essenzialmente la trasformazione inversa. Immagino che questo debba essere strutturato in qualche modo lungo queste linee dove ci sarà un richiamo ricorsivo a qualcosa di simile a questa logica, dal momento che le liste possono essere nominate (in cui ci sarà "$" che precede l'ultimo indice) o senza nome (nel qual caso ci sarà un certo numero racchiuso in
parseTxt <- function(Lobj) {
#setup logic
# Untested code... basically a structure to be filled in
rdLn <- function(Ln) {
for(ln in length(inp)) {
m <- gregexpr("\\[\\[|\\$", "$a$o[[2]]")
separators <- regmatches("$a$o[[2]]", m)
curr.nm=NA
if (tail(separators, 1) == "$"){
nm <- sub("^.+\\$","",ln)
if(!nm %in% curr.nm){ curr.nm <-c(nm, curr.nm) }
} else { if (tail(separators, 1) == '[['){
# here need to handle "[[n]]" case
} else { and here handle the "[n]" case
}
}
}
Seriamente, chiedere l'output 'dput'. Se non lo prevedono, lancia un downvote e vai avanti. Puoi * usare * una mostruosità come 'lapply (readLines (textConnection (gsub (" \ n (? = \ N) | \\ [\\ [\\ d * \\] \\] \ n | \\ [\ \ d * \\] "," ", test, perl = TRUE))), funzione (x) scan (textConnection (x)))', ma non lo farei. – Roland
Sono d'accordo con Roland. La mostruosità alternativa è 'read.delim (text = gsub (" \\ [+ \\ d + \\] + "," ", test), header = FALSE, sep =" ")' ma funziona solo per questo caso. – Andrie
@Andrie. Non funziona nemmeno qui. Fornisce un dataframe a 3 colonne anziché un elenco di 7 elementi. –