プロミス休憩して多重脱出です。短いです。
まず、マクロ(だと思って下さい)を定義します。
# マクロ(と思ってくださいね)を定義します。
._. <- function(e) {
delayedAssign(".V.", invokeRestart(".out"), assign.env = .GlobalEnv)
(function(e) {.Internal(.addRestart(structure(list(name = ".out", exit = environment()), class = "restart")));e})(e)
invisible()
}
つかいます。
> rm(list = ls()) # 全消去
> print(ls()) # 何もない
character(0)
>
> a <- c() # グローバル変数
>
> ._.({ # マクロ(と思ってくださね)開始
+
+ # 普通に書く
+ for(i in 1:3) {
+ for (j in 1:3) {
+ if (i == 2 && j == 2) .V. # .V. が脱出マクロ。i=j=2の時に脱出。
+ a <- c(a, paste(i, j)) # グローバル変数に代入
+ print(c(i, j)) # 途中までは実行される
+ }
+ }
+
+ }) # マクロ終了
[1] 1 1
[1] 1 2
[1] 1 3
[1] 2 1
>
> print(a) # ちゃんとある
[1] "1 1" "1 2" "1 3" "2 1"
関数の中でも使います。
> rm(list = ls()) # 全消去
>
> # 関数の中でも使えるか?
> z <- function() {
+
+ a <- c() # ローカル変数
+
+ ._.({ # 開始
+
+ for(i in 1:3) {
+ for (j in 1:3) {
+ if (i == 2 && j == 2) .V. # 脱出
+ a <- c(a, paste(i, j)) # ローカル変数に追加
+ print(c(i, j)) # 途中までは実行される
+
+ }
+ }
+ }) # 閉じマクロ
+
+ print(a) # ちゃんとある。
+ }
>
>
> z() # 関数を実行
[1] 1 1
[1] 1 2
[1] 1 3
[1] 2 1
[1] "1 1" "1 2" "1 3" "2 1" # ちゃんとローカルにある。
> a # グローバルにはない。
エラー: オブジェクト 'a' がありません
普通にtry
の中でstop
してもいいんですが、そうすると普通のエラーも例外処理されてしまうので。