使用“saveRDS()”编写文件,使其与旧版本的R向后兼容
我的计算集群最近更新到R版本R 3.6.0,并删除了旧版本的R。我一直在R 3.4.0中运行我的项目。我认为这很好,运行了一些代码,并在R3.6.0会话期间将输出保存为:使用“saveRDS()”编写文件,使其与旧版本的R向后兼容,r,R,我的计算集群最近更新到R版本R 3.6.0,并删除了旧版本的R。我一直在R 3.4.0中运行我的项目。我认为这很好,运行了一些代码,并在R3.6.0会话期间将输出保存为: saveRDS(output, output.path) 然后将该文件传输到另一台计算机,在该计算机上进行交互式R使用。这台计算机运行的是R/3.4.0,不能更新R的版本。当我打开上述文件时,出现以下错误: readRDS(output.path) Error in readRDS(output.path) : cannot
saveRDS(output, output.path)
然后将该文件传输到另一台计算机,在该计算机上进行交互式R使用。这台计算机运行的是R/3.4.0
,不能更新R的版本。当我打开上述文件时,出现以下错误:
readRDS(output.path)
Error in readRDS(output.path) : cannot read workspace version 3 written by R 3.6.0; need R 3.5.0 or newer
这真让人扫兴。我不是这两台计算机上的系统管理员,所以我不能只同步版本。这是我的问题:
有没有一种方法可以在R3.6.0中使用saveRDS()
编写文件,从而使其在R3.4.0环境中向后兼容?据我所知,您必须在saveRDS
中设置version=2
:
序列化格式版本3成为序列化的默认格式
并保存工作区(save()、serialize()、saveRDS(),
编译器::cmpfile())。无法读取格式为3的序列化数据
版本3.5.0之前的R版本。序列化格式版本2
仍然受支持,并且可以通过中的版本=2进行选择
保存/序列化函数。可以将默认设置更改回
通过设置环境变量完成整个R会话
R_DEFAULT_SAVE_VERSION和R_DEFAULT_SERIALIZE_VERSION为2。对于
最大的背面兼容性,文件“vignette.rds”和“partial.rdb”
由R CMD生成的是序列化格式版本2,以及
默认情况下,“重新保存”将生成序列化格式版本2的文件
(除非原件已采用第3版格式)
通过演示扩展我的评论:
$ Rscript --version | head -1
R scripting front-end version 3.6.0 (2019-04-26)
$ Rscript -e 'saveRDS(1:10, file="foo.rds")'
$
$ docker run --rm -ti r-base:3.4.0 Rscript --version | head -1
R scripting front-end version 3.4.0 (2017-04-21)
$ docker run --rm -ti -v ${PWD}:/work -w /work r-base:3.4.0 Rscript -e 'print(readRDS("foo.rds"))'
Error in readRDS("foo.rds") :
cannot read workspace version 3 written by R 3.6.0; need R 3.5.0 or newer
Calls: print -> readRDS
Execution halted
$
$ Rscript -e 'saveRDS(1:10, file="foo.rds", version=2)'
$ docker run --rm -ti -v ${PWD}:/work -w /work r-base:3.4.0 Rscript -e 'print(readRDS("foo.rds"))'
[1] 1 2 3 4 5 6 7 8 9 10
$
我使用我的普通R版本,显示为3.6.0,然后通过Rocker启动R3.4.0,也显示了它的版本
正如预期的那样,它首先会失败——一旦使用version=2
重新保存数据,它就会正常工作。请参阅help(saveRDS)
,并使用version
参数将saveRDS
与version=2
一起使用。