print(test2) [1] "b" 最佳答案 '<<-' 是为不属于 R 的副作用而设计的。永远不要使用它,或者只有在-6ren">
gpt4 book ai didi

r - R tryCatch block 中的变量范围 : is <<- necessary to change local variable defined before tryCatch?

转载 作者:行者123 更新时间:2023-12-04 09:33:20 27 4
gpt4 key购买 nike

考虑以下代码:

test1 <- "a"
test2 <- "a"
tryCatch(stop(), error= function(err){
print(test1)
print(test2)
test1 <- "b"
test2 <<- "b"
})

结果:
print(test1)
[1] "a"
print(test2)
[1] "b"

变量 test1 的值在 tryCatch 块中是可见的,但是使用“<-”运算符更改它不会影响它在 tryCatch 块外的值。

如果使用 <<- 分配了新值,则它具有所需的效果。为什么?

在 tryCatch 块中使用 <<- 运算符是否是更改此块外局部变量值的推荐方法?会不会有一些意想不到的副作用?

编辑:基于 Bernhard 的回答,以下代码是否可以解决此问题的正确方法?
test1 <- "a"
test2 <- "a"
new_values<-tryCatch(
{
print("hello")
stop()
}
, error= function(err){
# I want to change the test1 and test 2 variables to "b" only if error occurred.
test1 <- "b"
test2 <- "b"
return(list(test1=test1,test2=test2))
})
if (is.list(new_values))
{
test1<-new_values$test1
test2<-new_values$test2
}

结果:
> print(test1)
[1] "b"
> print(test2)
[1] "b"

最佳答案

'<<-' 是为不属于 R 的副作用而设计的。永远不要使用它,或者只有在内存或速度迫使你这样做时才使用它。一个块有它自己的范围,如果您想将块内的数据提供给“外部”环境,则该任务有 return() :

test2 <- "a"

test2 <- tryCatch(stop(), error= function(err){
somevariable <- "b"
return(somevariable)
})

这让每个人都清楚,顶层 test2 设置为“a”,然后顶层 test2 设置为其他内容。使用 '<<-' 很容易发生,某些函数会更改顶层 test2 并且有人想知道为什么顶层 test2 已被更改。只是不要<<-。

如果需要返回多个结果,则返回结果的列表或对象。

编辑:OP 指出您需要小心 return 语句,因为它们不仅结束当前块,而且结束当前函数。一个可能的解决方案是,在函数而不是简单的块中运行计算。以下示例应说明这一点:
safediv <- function(a, b){
normalDo <- function(a, b){
return(list(value=a/b, message=NULL))
}
exceptionalDo <- function(err){
return(list(value=NaN, message="caught an error! Change global variable?"))
}
results <- tryCatch(normalDo(a, b), error=exceptionalDo)
print("safediv is still running after the returns within the functions.")
return(results)
}

# try it out
safediv(5, 3)
safediv(5, 0)
safediv(5, "a")

关于r - R tryCatch block 中的变量范围 : is <<- necessary to change local variable defined before tryCatch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38482937/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com