は、以下のコードを検討:R tryCatchブロック内の可変スコープ:tryCatchより前に定義されたローカル変数を変更するには<<が必要ですか?
test1 <- "a"
test2 <- "a"
tryCatch(stop(), error= function(err){
print(test1)
print(test2)
test1 <- "b"
test2 <<- "b"
})
結果:
print(test1)
[1] "a"
print(test2)
[1] "b"
変数TEST1の値がtryCatchブロック内で可視であるが、とそれを変更する「< - 」演算子は、外部の値に影響を及ぼしませんtryCatchブロック
新しい値が< <で割り当てられている場合は、その効果があります。どうして?
tryブロックブロック内の< < - 演算子を使用して、このブロック外のローカル変数の値を変更することをお勧めしますか?予想外の副作用がありますか?
EDIT:Bernhardの回答に基づいて、この問題に対する正しいアプローチを次のコードで補完していますか?
test1 <- "a"
test2 <- "a"
new_values<-tryCatch(
{
print("hello")
stop()
}
, error= function(err){
# I want to change the test1 and test 2 variables to "b" only if error occurred.
test1 <- "b"
test2 <- "b"
return(list(test1=test1,test2=test2))
})
if (is.list(new_values))
{
test1<-new_values$test1
test2<-new_values$test2
}
結果:
> print(test1)
[1] "b"
> print(test2)
[1] "b"
技術的には、エラー状態が発生したときに呼び出される無名関数です。すべての伝統的な[スコープ規則](http://adv-r.had.co.nz/Functions.html#lexical-scoping)が適用されます。 '<< - 'には注意が払われていますが、それは賢明に使われるためにRによって提供されるツールです。パッケージを書くときにはしばしば必要となり、通常の分析/スクリプトではコメントやコメントを避ける必要があります。 – hrbrmstr