将复杂R对象的可逆收集结构作为字符串

时间:2014-04-29 15:24:00

标签: r parsing

我希望能够将复杂的R对象转换为字符串,然后返回原始对象。

为简单起见,我想说我有一个清单:

lt <- list(a=1:10,b=data.frame(a=10, b=1:5))
lt

如果我想在屏幕上看到这个,我会做以下事情:

dput(lt)

但是,以下方法无效:

x <- dput(lt)
x
x <- dput(lt,control="showAttributes")
x

因为x == lt。

的值

我根据之前的尝试尝试了几件事:例如: deparse

x <- deparse(lt)
x

有效,但逆转不起作用:

eval(parse(x))

以下是错误:

dump(lt)

我可以根据this advice

开始工作
x <- capture.output(dput(lt))
x <- paste(x,collapse="",sep="")
x

dget(textConnection(x))

但是,我想知道第一种方法有什么问题(使用eval(parse(x)))。 非常感谢任何帮助!!

1 个答案:

答案 0 :(得分:3)

我们有以下内容:

lt <- list(a=1:10,b=data.frame(a=10, b=1:5))
identical(eval(parse(text=deparse(lt))), lt)
## [1] TRUE

请注意text中的parse()参数设置。

此外,

identical(eval(dput(lt)), lt)
## structure(list(a = 1:10, b = structure(list(a = c(10, 10, 10, 
## 10, 10), b = 1:5), .Names = c("a", "b"), row.names = c(NA, -5L
## ), class = "data.frame")), .Names = c("a", "b"))
## [1] TRUE

这里,调用dput()的副作用是将其值打印到控制台。要禁用此功能,您可以例如将其输出重定向到/dev/null(但在Windows上无效)。

这绝对是使用dump最无礼的恕我直言方式:

f <- textConnection(NULL, open="w")
dump("lt", f)
val <- textConnectionValue(f)
close(f)
print(val)
## [1] "lt <-"                                                             
## [2] "structure(list(a = 1:10, b = structure(list(a = c(10, 10, 10, "    
## [3] "10, 10), b = 1:5), .Names = c(\"a\", \"b\"), row.names = c(NA, -5L"
## [4] "), class = \"data.frame\")), .Names = c(\"a\", \"b\"))"            
lt2 <- lt # copy
eval(parse(text=val)) # re-creates lt
identical(lt2, lt)
## [1] TRUE