Напишите файл, используя `saveRDS ()`, чтобы он был обратно совместим со старыми версиями R - PullRequest
3 голосов
/ 21 июня 2019

Мой вычислительный кластер недавно обновился до версии R 3.6.0 и удалил старые версии 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

Это облом.Я не являюсь системным администратором ни на одном из этих компьютеров, поэтому я не могу просто синхронизировать версии.Это мой вопрос:

Есть ли способ написать файл, используя saveRDS() в R 3.6.0, чтобы он был обратно совместим в среде R 3.4.0?

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Расширение моего комментария с демонстрацией:

$ 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, и затем я запускаю R 3.4.0 через Rocker, также показывая его версию.

Как и ожидалось, сначала происходит сбой - и после восстановления данных с помощью version=2 он работает как должен.

3 голосов
/ 21 июня 2019

Как я понимаю из здесь вы должны установить version = 2 в saveRDS:

Формат сериализации версии 3 становится по умолчанию для сериализации и сохранение рабочей области (save (), serialize (), saveRDS (), компилятор :: cmpfile ()). Сериализованные данные в формате 3 не могут быть прочитаны версии R до версии 3.5.0. Формат сериализации версия 2 все еще поддерживается и может быть выбран версией = 2 в функции сохранения / сериализации. По умолчанию можно изменить обратно для весь сеанс R путем установки переменных среды R_DEFAULT_SAVE_VERSION и R_DEFAULT_SERIALIZE_VERSION до 2. Для максимальная обратная совместимость, файлы «vignette.rds» и «частичное.rdb» сгенерированные R CMD build находятся в формате сериализации версии 2, и Resave по умолчанию создает файлы в формате сериализации версии 2 (если оригинал уже не в формате версии 3).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...