2

我有一个上传的 RDS 文件,然后通过curl::curl_fetch_memory()(via httr) 下载 - 这给了我 R 中的原始向量。

有没有办法读取表示 RDS 文件的原始向量以返回原始 R 对象?还是必须先将其写入磁盘?

我有一个类似于下面的设置:

saveRDS(mtcars, file = "obj.rds")
# upload the obj.rds file 
...
# download it again via httr::write_memory()
...

obj
#   [1] 1f 8b 08 00 00 00 00 00 00 03 ad 56 4f 4c 1c 55 18 1f ca 02 bb ec b2 5d 
# ...
is.raw(obj)
#[1] TRUE

它似乎readRDS()应该用来解压缩它,但它需要一个连接对象,我不知道如何从 R 原始向量创建连接对象 -rawConnection()看起来很有希望,但给出了:

rawConnection(obj)
#A connection with                           
#description "obj"          
#class       "rawConnection"
#mode        "r"            
#text        "binary"       
#opened      "opened"       
#can read    "yes"          
#can write   "no"     
readRDS(rawConnection(obj))
#Error in readRDS(rawConnection(obj)) : unknown input format

通过readRDS它看起来它看起来像它gzlib()在下面使用但无法让它与原始矢量对象一起使用。

如果通过httr::write_disk()-> curl::curl_fetch_disk()->下载它,readRDS()那么一切都很好,但这是磁盘往返,我想知道它是否可以针对大文件进行优化。

4

2 回答 2

3

默认情况下,RDS 文件流是 gzip 压缩的。要读取原始连接,您需要手动将其包装成gzcon

con = rawConnection(obj)
result = readRDS(gzcon(con))

即使没有压缩流,这也有效。但不幸的是,如果使用不同的受支持的压缩方法(例如'bzip2')来创建 RDS 文件,它会失败。不幸的是,R 似乎没有gzconbzip2 或 xz 的等价物。对于这些格式,唯一的办法似乎是将数据写入磁盘。

于 2021-04-23T12:23:34.293 回答
1

我遇到了完全相同的问题,对我来说,上面的答案gzcon不起作用,但是,我可以使用以下命令将原始对象直接加载到 R 的内存中rawConnection

load(rawConnection(obj))
于 2021-05-10T09:56:59.917 回答