使用`saveRDS()`编写文件,以使其与旧版本的R

时间:2019-06-21 13:41:47

标签: r

我的计算集群最近更新为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环境中向后兼容?

2 个答案:

答案 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)。