2014-04-29 42 views
1

我希望能夠將一個複雜的R對象轉換爲一個字符串,並將其轉換回原始對象。作爲一個字符串的複雜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 ==的值。

根據以前的嘗試,我嘗試了幾件事: 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

你爲什麼要重建呢?原始對象'lt'仍然存在。 –

回答

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