saveRDS()和readRDS()关于对象属性的行为

时间:2014-05-18 12:13:16

标签: r persistence environment persistent rdata

相应地,saveRDSreadRDS是否保存并恢复所有对象的属性,包括应用程序创建的属性(通过attr)?我尝试使用此方法而不是saveload,以尝试查找下面链接的问题的解决方法。但是,似乎并非如此,除非我做错了什么:Can I access R data objects' attributes without fully loading objects from file?

1 个答案:

答案 0 :(得分:14)

是的,他们这样做:

test <- structure(1:10, names=LETTERS[1:10], color='red', xxx='yyy')
attr(test, which='uuu') <- 'zzz'
test
##  A  B  C  D  E  F  G  H  I  J 
##  1  2  3  4  5  6  7  8  9 10 
## attr(,"color")
## [1] "red"
## attr(,"xxx")
## [1] "yyy"
## attr(,"uuu")
## [1] "zzz"
saveRDS(test, '/tmp/test.rds')
test2 <- readRDS('/tmp/test.rds')
identical(test, test2)
## [1] TRUE

R在很大程度上依赖于这些功能(以及它们的变体)。例如,它们用于保存用户的工作空间。因此,如果他们没有存储属性,那就太奇怪了。

但请注意,您无法存储一些动态创建的&#34;这些对象。这包括文件和SQL db连接处理程序,临时SQL结果处理程序等.RCpp编译函数的示例:

library('Rcpp')
library('inline')   
cppFunction("int one() { return 1; }")
one() # it works
## [1] 1
one # contains a pointer to dynamically allocated mem chunk
## function () 
## .Primitive(".Call")(<pointer: 0x7f52c33a7680>)
saveRDS(one, '/tmp/one.rds')

现在我们重启R ......

one <- readRDS('/tmp/one.rds')
one # the pointer is no longer valid
## function () 
## .Primitive(".Call")(<pointer: (nil)>)
one() # doesn't work
## Error in .Primitive(".Call")(<pointer: (nil)>) : 
##  NULL value passed as symbol address