У меня сложный объект списка, вывод функции моделирования (asreml). Объект содержит все виды типов данных, включая функции и формулы, к которым присоединены среды. Я не хочу сохранять среды в RDS, потому что они довольно большие, и я сохраняю много моделей.
Я наткнулся на параметр refhook=
в функциях serialize
и saveRDS
. В документации написано:
Функции refhook можно использовать для настройки обработки несистемных ссылочных объектов (всех внешних указателей и слабых ссылок, а также всех сред, кроме сред пространства имен и пакетов и .GlobalEnv). Функция ловушки для serialize должна возвращать символьный вектор для ссылок, которые она хочет обработать; в противном случае он должен возвращать NULL.
Данный пример модели
e <- new.env()
e$a = rnorm(10)
l <- list(a = e, b = 42)
Функция refhook действительно показывает некоторый эффект. Вывод становится меньше, когда я определяю функцию, которая возвращает символ, указывая, что среда не сохраняется:
length(serialize(l, connection = NULL))
[1] 338
s <- serialize(l,
connection = NULL,
refhook = function(x) "")
length(s)
[1] 109
Однако я не могу прочитать полученный объект:
unserialize(s)
Error in unserialize(s) :
no restore method available
Я также пробовал вывод необработанных векторов, подозревая, что, возможно, refhook предоставит альтернативный сериализованный вывод, но это не сработает:
s2 <- serialize(l,
connection = NULL,
refhook = function(x)
serialize("env", connection = NULL)))
Error in serialize(l, con = NULL, refhook = function(x) serialize("env", :
assertion 'TYPEOF(t) == STRSXP && LENGTH(t) > 0' failed: file 'serialize.c', line 982
Как мне использовать refhook=
? Какой вывод символов ожидается от этой функции?