我希望能够将复杂的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)))。 非常感谢任何帮助!!
答案 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