R中的tryCatch:返回出现警告时在try块中计算的内容 y

R中的tryCatch:返回出现警告时在try块中计算的内容 y,r,try-catch,R,Try Catch,如果希望显示警告消息,只需将警告函数参数跳过到tryCatch即可 x <- 1:10000000 x2 <- seq_len(length(x)/17) y <- tryCatch({ sum(x/x2) }, error=function(err){ return(NULL) }, warning=function(warn){

如果希望显示警告消息,只需将警告函数参数跳过到tryCatch即可

x <- 1:10000000
x2 <- seq_len(length(x)/17)

y <- tryCatch({ sum(x/x2) },
              error=function(err){
                return(NULL)
              },
              warning=function(warn){
                # how can I return the value of long_calculation(x)
                # without recomputing?
                return(sum(x/x2))
              })

x如果希望显示警告消息,只需将警告函数参数跳过到tryCatch即可

x <- 1:10000000
x2 <- seq_len(length(x)/17)

y <- tryCatch({ sum(x/x2) },
              error=function(err){
                return(NULL)
              },
              warning=function(warn){
                # how can I return the value of long_calculation(x)
                # without recomputing?
                return(sum(x/x2))
              })

x这不就是通过删除对警告的引用来简化代码的问题吗

x <- c(1:10000000)
y <- tryCatch(suppressWarnings({
  warning("Warning!")
  sum(x)
}), error = function(err) return(NULL))

long\u calculation这不就是通过删除任何警告来简化代码的问题吗

x <- c(1:10000000)
y <- tryCatch(suppressWarnings({
  warning("Warning!")
  sum(x)
}), error = function(err) return(NULL))

long\u计算嗡嗡声。你能让你的例子重现吗?@RomanLuštrik我补充了一些东西。我不确定它是否是可复制的,因为我无法想象sum会发出警告的任何情况。我已经做了
sum(x/x2)
发出警告。(发出警告的是
/
,而不是
sum
)。我认为您必须使用函数,而不是
tryCatch
,才能返回部分结果(假设我理解正确)。哼。你能让你的例子重现吗?@RomanLuštrik我补充了一些东西。我不确定它是否是可复制的,因为我无法想象sum会发出警告的任何情况。我已经做了
sum(x/x2)
发出警告。(给出警告的是
/
,而不是
sum
)。我认为您必须使用函数,而不是
tryCatch
,才能返回部分结果(假设我理解正确)。实际上,我想做的是能够捕获警告消息。这就是为什么我需要给警告参数赋值。然后我仍然想返回计算的结果。。。实际上,我想做的是能够捕获警告消息。这就是为什么我需要给警告参数赋值。然后我仍然想返回计算的结果。。。实际上,我想做的是能够捕获警告消息。这就是为什么我需要给警告参数赋值。然后我仍然想返回计算的结果。。。实际上,我想做的是能够捕获警告消息。这就是为什么我需要给警告参数赋值。然后我仍然想返回计算的结果。。。没有重新计算它。
long_calculation <- function(x){
  x2 <- seq_len(length(x)/17)
  sum(x/x2)  
}

x <- 1:10000000

y <- tryCatch({ long_calculation(x) },
              error = function(err) NULL
              )
#Warning message:
#In x/x2 :
#  longer object length is not a multiple of shorter object length

y
#[1] 1141800633