无法使用 tryCatch() 将错误案例添加到列表 R
Can't add error cases to list R using tryCatch()
我正在尝试调用一个 API 来限制过大请求的数据使用。我已分解数据以遵守所有使用条款。我想要做的是在我认为合理的块上调用 API,但是如果他们抛出错误,请取回有问题的块,然后进一步分解。我可以生成可行数据列表,但不能生成失败请求列表。这是我正在尝试的模型:
#create the data
a <- 1
b <- 2
c <- 'three'
d <- 4
ls <- list(a, b, c, d)
#create a function that will throw one error
add <- function(x){
output <- x + 1
return(output)
}
#Call a for loop that will populate two lists - one of viable calls and one of error cases
new_ls <- list()
errors_ls <- list()
for (i in 1:length(ls)) {
tryCatch({new_ls <- append(new_ls, list(add(ls[[i]])))}
, error = function(e) {errors_ls <- append(errors_ls, list(ls[[i]]))})
}
print(new_ls)
print(errors_ls)
给出:
> print(new_ls)
[[1]]
[1] 2
[[2]]
[1] 3
[[3]]
[1] 5
> print(errors_ls)
list()
值得注意的是 errors_ls
是空的。我期待的是:
[[1]]
[1] "three"
我很感激我应该通过申请来做这件事。然而 API 调用真的很混乱(我还人为地限制了调用频率,所以速度不是问题),所以我发现在 for 循环中迭代 API 调用更容易。我已经尝试按照 tryCatch
上的文档进行操作,包括根据其他帖子使用 tryCatch({})
语法的结构,但我无法正确理解。
有两种获取输出的方法。在 OP 的代码中,errors_ls
在函数 env 中被赋值,它没有更新全局 env 中的对象 'errors_ls'。我们可以使用 <<-
而不是 <-
来进行更改
new_ls <- list()
errors_ls <- list()
for (i in 1:length(ls)) {
tryCatch({new_ls <- append(new_ls, list(add(ls[[i]])))}
, error = function(e) {
errors_ls <<- append(errors_ls, list(ls[[i]]))})
}
-正在检查
> new_ls
[[1]]
[1] 2
[[2]]
[1] 3
[[3]]
[1] 5
> errors_ls
[[1]]
[1] "three"
或者另一种选择是在循环中进行更改以在外部进行赋值
new_ls <- list()
errors_ls <- list()
for (i in 1:length(ls)) {
tmp <- tryCatch({list(add(ls[[i]]))}
, error = function(e) {return(list(ls[[i]]))})
if(is.numeric(unlist(tmp)))
new_ls <- append(new_ls, tmp)
else errors_ls <- append(errors_ls, tmp)
}
-正在检查
> new_ls
[[1]]
[1] 2
[[2]]
[1] 3
[[3]]
[1] 5
> errors_ls
[[1]]
[1] "three"
我正在尝试调用一个 API 来限制过大请求的数据使用。我已分解数据以遵守所有使用条款。我想要做的是在我认为合理的块上调用 API,但是如果他们抛出错误,请取回有问题的块,然后进一步分解。我可以生成可行数据列表,但不能生成失败请求列表。这是我正在尝试的模型:
#create the data
a <- 1
b <- 2
c <- 'three'
d <- 4
ls <- list(a, b, c, d)
#create a function that will throw one error
add <- function(x){
output <- x + 1
return(output)
}
#Call a for loop that will populate two lists - one of viable calls and one of error cases
new_ls <- list()
errors_ls <- list()
for (i in 1:length(ls)) {
tryCatch({new_ls <- append(new_ls, list(add(ls[[i]])))}
, error = function(e) {errors_ls <- append(errors_ls, list(ls[[i]]))})
}
print(new_ls)
print(errors_ls)
给出:
> print(new_ls)
[[1]]
[1] 2
[[2]]
[1] 3
[[3]]
[1] 5
> print(errors_ls)
list()
值得注意的是 errors_ls
是空的。我期待的是:
[[1]]
[1] "three"
我很感激我应该通过申请来做这件事。然而 API 调用真的很混乱(我还人为地限制了调用频率,所以速度不是问题),所以我发现在 for 循环中迭代 API 调用更容易。我已经尝试按照 tryCatch
上的文档进行操作,包括根据其他帖子使用 tryCatch({})
语法的结构,但我无法正确理解。
有两种获取输出的方法。在 OP 的代码中,errors_ls
在函数 env 中被赋值,它没有更新全局 env 中的对象 'errors_ls'。我们可以使用 <<-
而不是 <-
来进行更改
new_ls <- list()
errors_ls <- list()
for (i in 1:length(ls)) {
tryCatch({new_ls <- append(new_ls, list(add(ls[[i]])))}
, error = function(e) {
errors_ls <<- append(errors_ls, list(ls[[i]]))})
}
-正在检查
> new_ls
[[1]]
[1] 2
[[2]]
[1] 3
[[3]]
[1] 5
> errors_ls
[[1]]
[1] "three"
或者另一种选择是在循环中进行更改以在外部进行赋值
new_ls <- list()
errors_ls <- list()
for (i in 1:length(ls)) {
tmp <- tryCatch({list(add(ls[[i]]))}
, error = function(e) {return(list(ls[[i]]))})
if(is.numeric(unlist(tmp)))
new_ls <- append(new_ls, tmp)
else errors_ls <- append(errors_ls, tmp)
}
-正在检查
> new_ls
[[1]]
[1] 2
[[2]]
[1] 3
[[3]]
[1] 5
> errors_ls
[[1]]
[1] "three"