【发布时间】:2014-11-30 19:13:58
【问题描述】:
有人刚刚发布了一些控制台输出作为示例。 (这种情况经常发生,我有将打印输出转换为向量和数据帧的策略。)我想知道是否有人有一种优雅的方法可以将其解析为真正的 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"
这是一个包含命名和未命名节点的示例:
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
我已经完成了str 如何处理列表的代码,但它本质上是在进行逆变换。我认为这需要在某种程度上按照这些思路进行结构化,其中将递归调用类似这种逻辑的东西,因为可以命名列表(其中最后一个索引之前将有“$”)或未命名(在这种情况下“[[.]]”中会有一个数字。
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
}
}
}
【问题讨论】:
-
说真的,要求
dput输出。如果他们不提供,请投反对票并继续前进。你可以使用像lapply(readLines(textConnection(gsub("\n(?=\n)|\\[\\[\\d*\\]\\]\n|\\[\\d*\\]", "", test, perl=TRUE))), function(x) scan(textConnection(x)))这样的怪物,但我不会。 -
我同意罗兰的观点。另一种怪物是
read.delim(text=gsub("\\[+\\d+\\]+", "", test), header=FALSE, sep=""),但仅适用于这种情况。 -
@Andrie。甚至在这里都行不通。提供 3 列数据框,而不是 7 元素列表。
-
@BondedDust 真的。关闭,但没有雪茄。