将原始矢量转换为R对象

时间:2016-03-20 21:19:34

标签: r base64 type-conversion

如何在不写入磁盘的情况下将原始向量转换回R对象?我想读取base64数据流并将其转换为R对象表示。这是一个例子 - 我如何从原始向量中取回lm对象?

## 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

2 个答案:

答案 0 :(得分:5)

在我的RcppRedis包中,我使用RApiSerialize包(它基于最初在Rhpc包中借用的基本R代码)来实时进行这些转换:

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

答案 1 :(得分:2)

对于R级访问,使用unserialize(serialize(mod, NULL))从R对象往返到原始向量并返回。