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

mja*_*iec 1 r

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

让我试着解释一下:

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

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

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

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

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

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

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

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

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

提前致谢.

r2e*_*ans 5

(如果您对将来学习如何研究此类问题不感兴趣,请跳至下面的" 结果 ".)

很长的故事 ...

了解有关如何存储R对象的一些信息save 将告知您如何使用它来检索它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)
Run Code Online (Sandbox Code Playgroud)

默认值compress将是!ascii压缩的含义TRUE,因此:

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

这里的关键是它默认为'gzip'压缩.从这里开始,我们来看看help(load):

'load'...可以直接从文件或合适的连接(包括调用'url')读取压缩文件(请参阅"保存").

(我强调的重点.)这意味着它将需要一个连接(这不是一个实际的文件),并且它"强制"压缩.我伪造文件连接的典型go-to函数textConnection虽然不适用于二进制文件,但它的帮助页面不提供二进制等价的参考.续help(load):

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

跳水一点点切向(还记得以前提到gzip 压缩?) help(gzcon):

压缩输出将包含嵌入的NUL字节,因此'con'不允许是用'open ="w"'打开的'textConnection'.使用可写的"rawConnection"将数据压缩为变量.

啊哈!现在我们看到有一个函数rawConnection可以(正确地)推断出二进制模式相当于 textConnection.

结果(又名"长篇短篇,太晚了")

你的pastebin代码很有意思,但遗憾的是没什么. 可重复的示例 使人们更容易考虑回答您的问题.

您的问题陈述,重申:

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`?
Run Code Online (Sandbox Code Playgroud)

答案:

load(rawConnection(x.raw, open='rb'))
Run Code Online (Sandbox Code Playgroud)

(确认:)

myvar1
##  [1] -1.2070657  0.2774292  1.0844412 -2.3456977  0.4291247
myvar2
##  [1] "s" "n" "g" "v" "x"
Run Code Online (Sandbox Code Playgroud)

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