我的计算集群最近更新为R版本R 3.6.0,并删除了旧版本的R。我一直在R 3.4.0中运行我的项目。我认为这很好,运行了一些代码,并在R 3.6.0会话中将输出保存为:
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
这真是令人讨厌。我不是这两台计算机上的系统管理员,因此我不能仅同步版本。这是我的问题:
是否有一种方法可以在R 3.6.0中使用saveRDS()
来写入文件,从而使其在R 3.4.0环境中向后兼容?
答案 0 :(得分: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
$
我使用显示为3.6.0的普通R版本,然后通过Rocker启动R 3.4.0,并显示其版本。
按预期的那样,它首先会失败-并且一旦用version=2
重新保存数据后,它便可以正常工作。
答案 1 :(得分:2)
根据here的了解,您必须在version = 2
中设置saveRDS
:
序列化格式版本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)。