Ktoś właśnie opublikował niektóre dane wyjściowe konsoli jako przykład. (Dzieje się tak dużo i mam strategie konwertowania wydruków dla wektorów i ramek danych.) Zastanawiam się, czy ktoś ma elegancką metodę analizowania tego na prawdziwą listę R?Konwersja listy wyjściowej konsoli do rzeczywistej listy R
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"
To jest przykład z nazwanych imieniem i UN-węzłów:
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
Pracowałam przez kodeks jak str
obsługuje list, ale to robi w zasadzie odwrotną transformację. Sądzę, że musi to być nieco ustrukturyzowane wzdłuż tych linii, gdzie będzie rekursywne wywołanie czegoś podobnego do tej logiki, ponieważ listy mogą być nazwane (w których będzie "$" poprzedzający ostatni indeks) lub nienazwane (w takim przypadku pojawi się numer zamknięty w
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
}
}
}
Poważnie, poproś o wyjście 'dput'. Jeśli tego nie zapewnią, odrzuć głos i przejdź dalej. Możesz * użyć * monstrum, takiego jak lapply (readLines (textConnection (gsub) ("\ n (? = \ N) | \\ [\\ [\\ d * \\] \\] \ n | \\ [\ \ d * \\] "," ", test, perl = TRUE))), funkcja (x) scan (textConnection (x)))', ale nie zrobiłbym tego. – Roland
Zgadzam się z Rolandem. Alternatywną monstrualnością jest 'read.delim (text = gsub (" \\ [+ \\ d + \\] + "," ", test), header = FALSE, sep =" ")' ale działa tylko w tym przypadku. – Andrie
@Andrie. Nawet tu nie działa. Podaje 3-kolumnową ramkę danych zamiast 7-elementowej listy. –