2017-08-15 48 views
10

的端部執行從文檔?reg.finalizerreg.finalizer()中的R包不中的R在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) 
> 
> 
$ 

回答

7

如果您將終結器函數註冊到包名稱空間環境,它將起作用。您可以使用.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 
+2

'.onLoad'的伎倆!謝謝! –