2017-03-07 31 views
1
while (!exists("j")) { 
    i <- 1 

    repeat { 
     tryCatch(expr = { 
      print(i) 

      raw.result <- evalWithTimeout(Sys.sleep(i), timeout = 3) 

      if (i == 1) { 
       j <- i 
      } else { 
       j <- c(j, i) 
      } 

      i <- i + 1 
     }, TimeoutException = function(ex) { 
      rm("j") 
     }) 
    } 
} 

上述代碼卡在i=4,並繼續執行i=4的功能,但是我希望它從i=1重新啓動,只要出現錯誤。如何重新啓動一個循環與Eval在R中超時?

有人可以請指導我在哪裏做錯了?

回答

1

在您的代碼TimeoutException無法找到j,因爲它在不同的環境中進行評估。即使它能夠找到它,也不會改變。由於tryCatch正在停止從打破repeat循環中的錯誤,因此repeat將繼續與當前i。您可以明確從repeat中跳出,但在這種情況下,您已刪除j,因此您的while將停止。

我不太清楚爲什麼你需要while循環這裏。

這是您的代碼的修改,將按您的需要工作。 明確設置i <- 1,並再次將其重新設置爲i <<-1(注意<<-,因爲i是tryCatch之上的一個環境)。

i <- 1 

repeat { 
    tryCatch(
    expr = { 
     print(i) 

     raw.result <- R.utils:evalWithTimeout(Sys.sleep(i), timeout = 3) 

     if (i == 1) { 
     j <- i 
     } else { 
     j <- c(j, i) 
     } 

     i <- i + 1 
    }, 
    TimeoutException = function(ex) { 
     i <<- 1 
    } 
) 
}