Ale*_*ekh 11 environment persistence r persistent rdata
不要saveRDS和readRDS,相应地,保存和恢复所有对象的属性,包括应用程序创建者(通过attr)?我试图使用这种方法而不是save和load,试图找到我的问题的解决方法链接在下面.但是,似乎并非如此,除非我做错了什么:我可以访问R数据对象的属性而无需从文件中完全加载对象吗?.
gag*_*ews 16
是的,他们这样做:
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
Run Code Online (Sandbox Code Playgroud)
R在很大程度上依赖于这些功能(以及它们的变体).例如,它们用于保存用户的工作区.因此,如果他们没有存储属性,那将是奇怪的.
但请注意,您无法使用这些对象存储某些"动态创建"的对象.这包括文件和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')
Run Code Online (Sandbox Code Playgroud)
现在我们重启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
Run Code Online (Sandbox Code Playgroud)