1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rによる多重ループ脱出

Posted at

プロミス休憩して多重脱出です。短いです。

まず、マクロ(だと思って下さい)を定義します。

# マクロ(と思ってくださいね)を定義します。
._. <- 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してもいいんですが、そうすると普通のエラーも例外処理されてしまうので。

1
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?