の全体のポイントはon.exit()
、終了ステータスに関係なく正確に実行されます。したがって、エラー信号は無視されます。これはfinally
、tryCatch関数のステートメントと同等のafaikです。
通常の終了時にのみコードを実行する場合は、コードの最後に配置するだけです。else
はい、ステートメントを使用し、出口点を1つだけ作成して、少し再構築する必要がありますが、それは一部の人にとっては優れたコーディング手法と見なされています。
あなたの例を使用すると、それは次のようになります。
myfunction = function() {
...
if (...) then out <- point 1
...
else if (...) then out <- point 2
...
else if (...) then out <- point 3
...
else out <- point 4
WhateverNeedsToRunBeforeReturning
return(out)
}
または、を使用したこのアイデアの優れた実装については、Charlesの回答をlocal()
参照してください。
の使用を主張する場合on.exit()
は、トレースバックメカニズムの動作を賭けて次のようなことを行うことができます。
test <- function(x){
x + 12
}
myFun <- function(y){
on.exit({
err <- if( exists(".Traceback")){
nt <- length(.Traceback)
.Traceback[[nt]] == sys.calls()[[1]]
} else {FALSE}
if(!err) print("test")
})
test(y)
}
.Traceback
エラーが発生した最後の呼び出しスタックが含まれています。そのスタックの一番上の呼び出しが現在の呼び出しと等しいかどうかを確認する必要があります。その場合、呼び出しが最後のエラーをスローした可能性が非常に高くなります。したがって、その条件に基づいて、私が決して使用しないソリューションを自分でハックすることを試みることができます。