2016-03-20 5 views
7

生ベクターをディスクに書き込まずにRオブジェクトに戻す方法を教えてください。私は、base64データのストリームを読み込んで、それをRオブジェクト表現に変換したいと考えています。ここに例があります - lmオブジェクトを生ベクターからどのように戻すのですか?私はその場でこれらの変換を行うために(最初はRhpcパッケージに借りベースRコードに基づいています)RApiSerializeパッケージを使用して、私のRcppRedisパッケージ内生ベクターをRオブジェクトに変換する

## some rdata -- writes to temp file! 
mod <- lm(mpg ~ cyl, data=mtcars) 
f1 <- tempfile() 
save(mod, file=f1, compress="bzip2") 

library(base64enc) 
r1 <- readBin(f1, "raw", n=file.info(f1)[1, "size"]) 
r2 <- base64decode(base64encode(file(f1, "rb"))) # emulate input base64 
identical(r1, r2) 

## I can get mod back by writing to file and loading, but how to just 
## load from a raw vector? 
rm(mod) # get rid of mod 
f2 <- tempfile() 
writeBin(r2, f2) 
load(f2) # mod is back 

答えて

5

R> mod <- lm(mpg ~ cyl, data=mtcars)  # your example 
R> 
R> library(RApiSerialize) 
R> modraw <- serializeToRaw(mod)   # serialized 
R> str(modraw)       # really just a raw vector now 
raw [1:6819] 58 0a 00 00 ... 
R> 

だから、この時点であなたは生のベクトルで何でもできます。それは、ディスクへの書き込みには、データベースへの書き込み(私たちはRcppRedisでそうであるように)、....

しかし重要なのは、あなたはまた戻って、あなたのモデルを得る:R-レベルのアクセスを使用するために

R> summary(unserializeFromRaw(modraw)) 

Call: 
lm(formula = mpg ~ cyl, data = mtcars) 

Residuals: 
    Min  1Q Median  3Q Max 
-4.981 -2.119 0.222 1.072 7.519 

Coefficients: 
      Estimate Std. Error t value Pr(>|t|)  
(Intercept) 37.885  2.074 18.27 < 2e-16 *** 
cyl   -2.876  0.322 -8.92 6.1e-10 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 3.21 on 30 degrees of freedom 
Multiple R-squared: 0.726, Adjusted R-squared: 0.717 
F-statistic: 79.6 on 1 and 30 DF, p-value: 6.11e-10 

R> 
+0

私は、_after_直列化を圧縮し、_前回の逆直列化を解凍できると思います。しかし、 'save()'と 'load()'よりも優れた 'saveRDS()'と 'readRDS()'を見て、それをオフにしない限りcompression_を使用していると思います。そして、はい、全体の話題は少し混乱しますが、上記の(*)RDS()関数と上の直列化関数は良いチャンクを助けます。これには 'base64'だけがあります... –

2

unserialize(serialize(mod, NULL)) Rオブジェクトから生のベクトルまで往復して戻ってきます。

関連する問題