R中的tryCatch块,更改外部变量的值

use*_*890 6 error-handling r try-catch

这是我的代码。它会产生无限循环,因为something变量的值在捕获的错误内不会改变。应该是这样吗?我该如何修复它以使 的值something更改为FALSE

something <- TRUE
counter <- 1
while(something){
  print(counter)  
  tryTest = tryCatch(
    {
      arima(rep(1,3), order = c(1,0,0))
    }, 
    warning = function(w) {

      print('this is warning')
      print(w)
    },
    error = function(e) {
      something <- FALSE
      print('this is error')
      print(e)
    },
    finally = {}
  )
  counter <- (counter +1)
}
Run Code Online (Sandbox Code Playgroud)

Mos*_*ite 8

发生这种情况是因为外部代码中的环境与lambda 中something的环境不同:something

function(e) {
    something <- FALSE
    print('this is error')
    print(e)
}
Run Code Online (Sandbox Code Playgroud)

因此,something <- FALSE在 lambda 中设置实际上会something在外部代码中设置不同的值。要解决此问题,您可以 1) 创建something一个全局变量或 2) 创建一个要使用的环境something

1)

assign("something", TRUE, env=globalenv())
Run Code Online (Sandbox Code Playgroud)

设置变量和

get("something", env=globalenv())
Run Code Online (Sandbox Code Playgroud)

来访问变量。

您还可以something以相同的方式在 lambda 内部设置:

assign("something", FALSE, env=globalenv())
Run Code Online (Sandbox Code Playgroud)

或者

2)

首先创建一个新变量:

env=new.env()
Run Code Online (Sandbox Code Playgroud)

然后以与以前类似的方式设置和访问变量:

assign("something", TRUE, env=env)
get("something", env=env)
Run Code Online (Sandbox Code Playgroud)

您可以something在 lambda 内部分配:

assign("something", FALSE, env=env)
Run Code Online (Sandbox Code Playgroud)

使用env是可能的,因为 R 将变量复制到子环境。但是,如果您在子环境中设置变量(例如当您执行“somethi