2016-03-20 15 views
7

Come convertire un vettore non elaborato in un oggetto R senza scrivere sul disco? Voglio leggere un flusso di dati base64 e convertirlo nella sua rappresentazione dell'oggetto R. Ecco un esempio: come posso recuperare l'oggetto lm dal vettore raw?Converti il ​​vettore non elaborato nell'oggetto 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 

risposta

5

Dentro il mio pacchetto RcppRedis utilizzare il pacchetto di RApiSerialize (che si basa sul codice di base R inizialmente preso in prestito nel pacchetto Rhpc) per fare queste conversioni al volo:

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> 

Quindi a questo punto puoi fare quello che vuoi con il vettore grezzo. Scrivi su disco, scrive in un database (come facciamo con RcppRedis), ....

Ma, soprattutto, si ottiene anche il vostro modello di schiena:

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

Immagino che possa comprimere _after_ serializzazione e decomprimere _prima_ la deserializzazione. Ma probabilmente vorrai esaminare 'saveRDS()' e 'readRDS()' che sono superiori a 'save()' e 'load()' e _already usano compression_ a meno che non lo spegni. E sì, l'intero argomento è un po 'confuso, ma le funzioni '* RDS()' e le mie (de) funzioni di serializzazione sopra aiutano una buona parte. C'è di più a questo solo 'base64' ... –

2

Per l'uso di accesso a livello R unserialize(serialize(mod, NULL)) per andare da un oggetto R a un vettore grezzo e viceversa.