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

时间:2018-01-22 21:58:05

标签: r error-handling 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)
}

1 个答案:

答案 0 :(得分:1)

这是因为外部代码中的something环境与您的lambda的something环境不同:

function(e) {
    something <- FALSE
    print('this is error')
    print(e)
}

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

1)

assign("something", TRUE, env=globalenv())

设置变量和

get("something", env=globalenv())

访问变量。

您也可以用同样的方式在lambda中设置something

assign("something", FALSE, env=globalenv())

2)

首先创建一个新变量:

env=new.env()

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

assign("something", TRUE, env=env)
get("something", env=env)

您可以在lambda中指定something

assign("something", FALSE, env=env)

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

时)