2017-08-15 20 views
10

の最後に実行されません:reg.finalizer()RパッケージにRのドキュメント<code>?reg.finalizer</code>からRセッション

とりわけ、それが実行されるようにコードをプログラムする方法を提供しますRセッションの終わりに.Lastを操作せずに。パッケージで使用するには、名前空間のオブジェクトにファイナライザを設定することをお勧めします。セッションの終わりに、またはセッション中に名前空間がアンロードされた直後に呼び出されます。

reg.finalizer()は、Rセッションが終了したときに特定のコードを実行することができますが、私にとってはうまくいかないようです。私ならば、私は単にインタラクティブRセッションで上記のコードを実行して、セッションを終了すると

e = new.env() 

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

、私はメッセージBye!を見ることができますが、私は基本的に以下のコードが含まれていますhttps://github.com/yihui/finalizer-testで最小のパッケージを、用意してい上記のパッケージ(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'はトリックをしました!ありがとう! –