在R?中的内存数据处理中:save - > readBin - >?

时间:2014-05-11 17:27:30

标签: r

如何访问最初使用SAVE命令保存的R数据,然后使用readBin读取?

让我试着解释一下:

我使用SAVE命令将一些数据(主要是矩阵和列表)保存到文件中。

后来我转换了这个文件(加密)并使用writeBin保存它。

由于文件被转换,我无法使用LOAD直接获取数据,但需要使用readBin并在内存中执行相反的转换。

问题是,在用readBin和转换读取之后,数据在内存中,但是我不能将它们作为R对象(例如矩阵或列表)访问,因为它们不被识别为这样(只有单个二进制对象) )。

最简单的方法是使用此二进制对象作为LOAD的连接。

不幸的是,LOAD不接受内存中的二进制连接。

我猜 .Internal(loadFromConn2(...))可能是关键,但我没有内部工作的详细信息。

有没有办法让R将存储在内存中的二进制数据识别为R原始对象(矩阵,列表等)的二进制对象?

我正在使用的加密代码位于:http://pastebin.com/eVfVQYwn

提前致谢。

1 个答案:

答案 0 :(得分:5)

(如果你对学习如何研究这种类型的东西不感兴趣 将来的问题,请跳至“结果”,远远低于此。)

长篇小说......

通过save了解 R对象的存储方式 将告知您如何使用load检索它。来自help(save)

 save(..., list = character(),
      file = stop("'file' must be specified"),
      ascii = FALSE, version = NULL, envir = parent.frame(),
      compress = !ascii, compression_level,
      eval.promises = TRUE, precheck = TRUE)

compress的默认值为!ascii,这意味着压缩将会 是TRUE,所以:

  

compress:指定是否保存为的逻辑或字符串                命名文件是使用压缩。 'TRUE'对应于                'gzip'压缩,......

这里的关键是默认为'gzip'压缩。从这里, 让我们看看help(load)

  

'load'...可以直接从a读取压缩文件(请参阅“保存”)   来自合适连接的文件或 (包括致电   'URL')。

(我强调的重点。)这意味着它需要一个 连接(不是实际文件),它“强制” 压缩的烦躁。我伪造文件连接的典型定位功能 是textConnection,虽然这不适用于二进制文件,并且 其帮助页面未提供二进制等效的参考。 继续help(load)

  

未打开的连接将以“rb”模式打开并在之后关闭   使用。除“gzfile”或 'gzcon' 以外的任何连接   连接将包含在'gzcon'中以允许压缩保存   被处理......

有点切向潜水(记得前面提到的gzip 压缩?),help(gzcon)

  

压缩输出将包含嵌入的NUL字节,因此'con'   不允许使用'open =打开'textConnection'   “W””。 使用可写的“rawConnection” 将数据压缩到   变量。

啊哈!现在我们看到有一个函数rawConnection 将(正确)推断是二进制模式等价的 textConnection

结果(又名“长话短说,太晚了”)

您的pastebin代码很有趣,但遗憾的是没什么可说的。 Reproducible examples 让那些考虑回答你问题的人更容易。

您的问题陈述,重申:

set.seed(1234)
fn <- 'test-mjaniec.Rdata'
(myvar1 <- rnorm(5))
##  [1] -1.2070657  0.2774292  1.0844412 -2.3456977  0.4291247
(myvar2 <- sample(letters, 5))
##  [1] "s" "n" "g" "v" "x"
save(myvar1, myvar2, file=fn)
rm(myvar1, myvar2) ## ls() shows they are no longer available

x.raw <- readBin(fn, what=raw(), n=file.info(fn)$size)
head(x.raw)
## [1] 1f 8b 08 00 00 00
## how to access the data stored in `x.raw`?

答案:

load(rawConnection(x.raw, open='rb'))

(确认:)

myvar1
##  [1] -1.2070657  0.2774292  1.0844412 -2.3456977  0.4291247
myvar2
##  [1] "s" "n" "g" "v" "x"

(顺便说一句,它也适用于您的加密代码。)