首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R包中的reg.finalizer()不会在R会话结束时执行

R包中的reg.finalizer()不会在R会话结束时执行
EN

Stack Overflow用户
提问于 2017-08-15 17:25:02
回答 2查看 465关注 0票数 12

来自R中的文档?reg.finalizer

除其他外,它提供了一种在R会话结束时运行的代码的编程方法,而无需操作.Last。要在包中使用,通常对名称空间中的对象设置终结器是个好主意:然后在会话结束时调用它,如果在会话期间卸载命名空间,则在卸载名称空间后不久调用它。

当R会话结束时,我似乎可以使用reg.finalizer()运行某些代码,但它对我不起作用。我已经在https://github.com/yihui/finalizer-test准备了一个最小的包,它基本上包含以下代码:

代码语言:javascript
复制
e = new.env()

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

如果我只是在交互式R会话中运行上面的代码并退出会话,我可以看到消息Bye!,但是如果我安装了上面的包(您可以使用devtools::install_github('yihui/finalizer-test')),将它加载到一个R会话中,然后退出R会话,我就看不到消息了。我想知道为什么在这种情况下不执行终结器。

FWIW,当我安装这个软件包时,我可以看到消息Bye!

代码语言:javascript
复制
$ 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)

当我运行下面的命令时,我也看不到消息:

代码语言:javascript
复制
$ R -e "library(finalizer)"
> library(finalizer)
> 
> 
$ 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-15 22:21:07

如果将终结器函数注册到包名空间环境中,它就会工作。为此,您可以使用.onLoad钩子:

代码语言:javascript
复制
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上创建了测试包的分叉

代码语言:javascript
复制
> 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
票数 9
EN

Stack Overflow用户

发布于 2018-09-14 07:12:44

不是一个真正的答案(接受的答案很好),但我也注意到,在某些情况下,如print和cat在退出时运行终结器时不会产生可见的输出,至少在使用RStudio时是这样。

我还没有看到一个模式,但我想有一个赛车条件,在某些情况下,stdout是在终结器函数执行/完成之前关闭的。我想使用message()也会引起同样的问题。

因此,如果您想在退出时执行该函数,用消息测试它可能会误导您。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45698176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档