【问题标题】:tryCatch block in R, change value of outer variableR中的tryCatch块,更改外部变量的值
【发布时间】:2018-07-01 15:13:48
【问题描述】:

这是我的代码。它会产生无限循环,因为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)
}

【问题讨论】:

  • 定义你的警告函数为:warning = function(w) { something &lt;&lt;- FALSE print('this is warning') print(w) } ,其中""这个操作符将变量分配给父作用域。它首先在父作用域中查找变量,然后如果找不到,则在父范围内创建一个新的。" - studytrails.com/r/core/assignmentoperator
  • @nadizan,我刚试了,还是不行,还是死循环
  • @nadizan 您的建议的问题是 lambda 的父范围仍在 tryCatch 函数内,而不是外部范围。
  • 作为旁注。出错时,错误函数的返回值由tryCatch 出错时返回。你总是可以用它来停止你的循环。 tryTest 的条件为非 NULL 以继续您的循环。只要确保在警告中返回非空值即可。

标签: r error-handling try-catch


【解决方案1】:

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

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

因此,在您的 lambda 中设置 something &lt;- 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多