如何访问最初使用SAVE命令保存的R数据,然后使用readBin读取?
让我试着解释一下:
我使用SAVE命令将一些数据(主要是矩阵和列表)保存到文件中。
后来我转换了这个文件(加密)并使用writeBin保存它。
由于文件被转换,我无法使用LOAD直接获取数据,但需要使用readBin并在内存中执行相反的转换。
问题是,在用readBin和转换读取之后,数据在内存中,但是我不能将它们作为R对象(例如矩阵或列表)访问,因为它们不被识别为这样(只有单个二进制对象) )。
最简单的方法是使用此二进制对象作为LOAD的连接。
不幸的是,LOAD不接受内存中的二进制连接。
我猜 .Internal(loadFromConn2(...))可能是关键,但我没有内部工作的详细信息。
有没有办法让R将存储在内存中的二进制数据识别为R原始对象(矩阵,列表等)的二进制对象?
我正在使用的加密代码位于:http://pastebin.com/eVfVQYwn
提前致谢。
答案 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"
(顺便说一句,它也适用于您的加密代码。)