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