Подтвердить что ты не робот

Reg.finalizer() в пакете R не выполняется в конце сеанса R

Из документации ?reg.finalizer в R:

В частности, он предоставляет способ программирования кода, который должен быть запущен в конце сеанса R без манипулирования .Last. Для использования в пакете часто бывает полезно установить финализатор для объекта в пространстве имен: тогда он будет вызываться в конце сеанса или вскоре после того, как пространство имен будет выгружено, если это будет сделано во время сеанса.

Кажется, я могу использовать reg.finalizer() для запуска определенного кода при завершении сеанса R, но он не работает для меня. Я подготовил минимальный пакет https://github.com/yihui/finalizer-test, который в основном содержит следующий код:

e = new.env()

reg.finalizer(e, function(e) {
  message('Bye!')
}, onexit = TRUE)

Если я просто запускаю вышеуказанный код в интерактивном сеансе R и выхожу из сеанса, я могу увидеть сообщение Bye!, но если я установлю вышеуказанный пакет (вы можете использовать devtools::install_github('yihui/finalizer-test')), загрузите его в R сеанс и выйти из сеанса R, я не вижу сообщение. Интересно, почему финализатор не выполняется в этом случае.

FWIW, когда я устанавливаю пакет, я вижу сообщение Bye!:

$ R CMD INSTALL .

* installing to library ‘/Users/yihui/R’
* installing *source* package ‘finalizer’ ...
** R
** preparing package for lazy loading
No man pages found in package  ‘finalizer’ 
** help
*** installing help indices
Bye!
** building package indices
** testing if installed package can be loaded
* DONE (finalizer)

Я тоже не вижу сообщение, когда запускаю следующую команду:

$ R -e "library(finalizer)"
> library(finalizer)
> 
> 
$ 
4b9b3361

Ответ 1

Он работает, если вы зарегистрируете функцию finalizer в среде пространства имен пакета. Вы можете использовать для этого .onLoad:

e = new.env()

reg.finalizer(e, function(e) {
  message('Object Bye!')
}, onexit = TRUE)


finalize <- function(env) {
   print(ls(env))
   message("Bye from Name space Finalizer")
}


.onLoad <- function(libname, pkgname) {
   parent <- parent.env(environment())
   print(str(parent))
   reg.finalizer(parent, finalize, onexit= TRUE)
}

Функция финализатора объекта не вызывается, но поскольку у вас есть вся среда пространства имен, она, вероятно, не нужна.

Я создал вилку вашего тестового пакета на https://github.com/mpbastos/finalizer-test:

> devtools::install_git("https://github.com/mpbastos/finalizer-test")
Downloading git repo https://github.com/mpbastos/finalizer-test
Installing finalizer
"C:/PROGRA~1/R/R-34~1.0/bin/x64/R" --no-site-file --no-environ --no-save  \
  --no-restore --quiet CMD INSTALL  \
  "C:/Users/mbastos/AppData/Local/Temp/RtmpOGymjQ/file5cf829e63957"  \
  --library="\\sharedfs/MyDocs6/mbastos/Documents/R/win-library/3.4"  \
  --install-tests

* installing *source* package 'finalizer' ...
** R
** preparing package for lazy loading
** help
No man pages found in package  'finalizer'
*** installing help indices
** building package indices
Object Bye!
** testing if installed package can be loaded
*** arch - i386
<environment: namespace:finalizer>
NULL
[1] "e"        "finalize"
Bye from Name space Finalizer
*** arch - x64
<environment: namespace:finalizer>
NULL
[1] "e"        "finalize"
Bye from Name space Finalizer
* DONE (finalizer)
> library(finalizer)
<environment: namespace:finalizer>
NULL
> q()
Save workspace image? [y/n/c]: n
[1] "e"        "finalize"
Bye from Name space Finalizer