親呼び出しにon.exit exprを追加することはできますか?もしそうなら、どうですか?親呼び出しにon.exit exprを追加しますか?
たとえば、parentOnExit(expr)はこれを実装する関数です。次に、次のコードの場合:
f <- function() {
parentOnExit(print("B"))
print("A")
}
"A"が表示され、次に "B"が表示されます。
背景:これを念頭に置いた理由は次のとおりです。関数のコレクションがあり、そのうちのいくつかは他のものを呼び出します。リソースは最上位の呼び出しから共有される必要があります。最上位の機能を終了します。例えば、オープンするのに高価なリモートサーバへの接続。この一つのパターンは次のとおりです。
foo <- function(r=NULL) {
if (is.null(r)) { # If we weren't passed open connection, open one
r <- openR()
on.exit(close(r))
}
bar(r=r) # Pass the open connection down
}
私はこれらの3つのラインまでの抽象化に期待していた
:今、私もそれについて考えることを
r <- openIfNull(r) # Magically call on.exit(close(r)) in scope of caller
、おそらくそれはあまりにも不思議な何かを避けるために、いくつかの繰り返しのコードの価値があります。しかし、私は元の質問に対する答えが不思議です。ありがとうございました!
これは私にとっては意味がありません。目的が関数からオープンな接続を返すことであるなら、なぜあなたは 'on.exit'でそれを閉じますか? –
私はopenIfNullの中でon.exitを呼びたくありません。 openIfNullが新しいオープン接続を返したことを前提に、openIfNullを呼び出す関数のコンテキストで呼び出す必要があります。したがって、openIfNullを呼び出すと、openIfNullが呼び出された関数を終了したときに自動的に新しい接続を閉じるという副作用があります。 (これは会話の種類で、私にとってはこれが悪いことだと確信しています) –
@DavidF - DWinが答えたので、あなたの現在のトップの例はあまり良くありません。単純に 'parentOnExit < - on.exit'を定義すれば、それを解決できます。 – Tommy