Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用“saveRDS()”编写文件,使其与旧版本的R向后兼容_R - Fatal编程技术网

使用“saveRDS()”编写文件,使其与旧版本的R向后兼容

使用“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

我的计算集群最近更新到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 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
一起使用。