for 循环中的 tryCatch
tryCatch within for loop
我是R新手,网上查了大部分链接,还是没能解决问题。
这是我正在做的 Monte Carlo 模拟的可重现示例:
rm(list = ls())
x=c(-2,3,-1,4,'A')
y=rep(0,5)
for(i in 1:5){
tryCatch(
expr = {
y[i]=log(x[i])
},
error = function(e){
message('Caught an error!',i)
return(NA)
},
warning = function(w){
message('Caught an warning!',i)
return(NA)
}
)
}
请问我该如何修正代码,以便在 for 循环结束时,R returns y 的值是
y= NA,log(3),NA,log(4),NA
i=1,3,5
以及出现错误或警告的 i 的值。
也就是说,错误和警告被替换为 NA 并返回成功的评估,并且还返回出现错误或警告的 i 的值。
谢谢
用 NA
初始化 y
,然后 运行 for
循环。此外,由于 x
是一个向量,而向量只能容纳一个 class,因此 x
中的所有数字都将转换为字符,因为 x
中有非数字元素,因此您需要在取 log
.
之前将它们转换为数字
x=c(-2,3,-1,4,'A')
y=rep(NA,5)
for(i in 1:5){
tryCatch(
expr = {
y[i]= log(as.numeric(x[i]))
},
error = function(e){
message('Caught an error!',i)
},
warning = function(w){
message('Caught a warning! ',i)
}
)
}
#Caught a warning! 1
#Caught a warning! 3
#Caught a warning! 5
y
#[1] NA 1.098612 NA 1.386294 NA
然后使用 is.na
和 which
来获取发生错误或警告的索引。
which(is.na(y))
#[1] 1 3 5
当然,你也可以不使用 for
循环
y <- log(as.numeric(x))
which(is.na(y))
#[1] 1 3 5
到return
基于错误或警告的不同值,我们可以把它做成一个函数
run_fun <- function(x) {
tryCatch(
expr = {
return(log(as.numeric(x)))
},
error = function(e){
message('Caught an error!',i)
return(100)
},
warning = function(w){
message('Caught a warning! ',i)
return(200)
}
)
}
然后在for
循环中调用它。
for (i in seq_along(x)) {
y[i] <- run_fun(x[i])
}
y
#[1] 200.0000 1.0986 200.0000 1.3863 200.0000
我是R新手,网上查了大部分链接,还是没能解决问题。 这是我正在做的 Monte Carlo 模拟的可重现示例:
rm(list = ls())
x=c(-2,3,-1,4,'A')
y=rep(0,5)
for(i in 1:5){
tryCatch(
expr = {
y[i]=log(x[i])
},
error = function(e){
message('Caught an error!',i)
return(NA)
},
warning = function(w){
message('Caught an warning!',i)
return(NA)
}
)
}
请问我该如何修正代码,以便在 for 循环结束时,R returns y 的值是
y= NA,log(3),NA,log(4),NA
i=1,3,5
以及出现错误或警告的 i 的值。 也就是说,错误和警告被替换为 NA 并返回成功的评估,并且还返回出现错误或警告的 i 的值。
谢谢
用 NA
初始化 y
,然后 运行 for
循环。此外,由于 x
是一个向量,而向量只能容纳一个 class,因此 x
中的所有数字都将转换为字符,因为 x
中有非数字元素,因此您需要在取 log
.
x=c(-2,3,-1,4,'A')
y=rep(NA,5)
for(i in 1:5){
tryCatch(
expr = {
y[i]= log(as.numeric(x[i]))
},
error = function(e){
message('Caught an error!',i)
},
warning = function(w){
message('Caught a warning! ',i)
}
)
}
#Caught a warning! 1
#Caught a warning! 3
#Caught a warning! 5
y
#[1] NA 1.098612 NA 1.386294 NA
然后使用 is.na
和 which
来获取发生错误或警告的索引。
which(is.na(y))
#[1] 1 3 5
当然,你也可以不使用 for
循环
y <- log(as.numeric(x))
which(is.na(y))
#[1] 1 3 5
到return
基于错误或警告的不同值,我们可以把它做成一个函数
run_fun <- function(x) {
tryCatch(
expr = {
return(log(as.numeric(x)))
},
error = function(e){
message('Caught an error!',i)
return(100)
},
warning = function(w){
message('Caught a warning! ',i)
return(200)
}
)
}
然后在for
循环中调用它。
for (i in seq_along(x)) {
y[i] <- run_fun(x[i])
}
y
#[1] 200.0000 1.0986 200.0000 1.3863 200.0000