11

saveRDSおよびは、アプリケーションによって ( を介して)readRDS作成されたものを含め、すべてのオブジェクトの属性を保存および復元しますか? 以下にリンクされている問題の回避策を見つけるために、andattrの代わりにこのアプローチを使用しようとしました。ただし、何か間違ったことをしていない限り、そうではないようです。ファイルからオブジェクトを完全にロードせずに R データ オブジェクトの属性にアクセスできますか? .saveload

4

1 に答える 1

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

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')

今、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
于 2014-05-18T12:17:18.310 に答える