try()和tryCatch()不使用R列表超出范围

时间:2016-01-11 21:17:44

标签: r

基本上我循环遍历数据库中的项目,这些项目为我提供了列表对象,我试图从中提取数据。当我尝试从列表中提取数据到数据库时,当数据不可用于给定对象时,我将收到以下错误:

>scd[a,paste0("b",".iss..",b)]= sc[["content"]][["abstracts-retrieval-response"]][["item"]][["bibrecord"]][["tail"]][["bibliography"]][["reference"]][[b]][["ref-info"]][["ref-volisspag"]][["voliss"]][["@issue"]]
Error in `*tmp*`[[jj]] : subscript out of bounds

发生错误时,它会停止循环。我只是希望R在没有可用信息的情况下返回NA,那么我将如何进行此操作。我试过在try({})上包装上面的代码,但它似乎没有解决问题 - 我认为这是因为它只适用于函数?是否有一种简单的方法让它适用于上述?

我尝试了以下代码:

scd[a,paste0("b",".vol..",b)]= as.numeric(tryCatch(sc[["content"]][["abstracts-retrieval-response"]][["item"]][["bibrecord"]][["tail"]][["bibliography"]][["reference"]][[b]][["ref-info"]][["ref-volisspag"]][["voliss"]][["@volume"]],error = function(e) NA))    
Error in `*tmp*`[[jj]] : subscript out of bounds

在进一步调查之后出现问题,因为当列表中没有可用数据时,它返回NULL而不是NA,然后它不能将其添加到数据帧。

1 个答案:

答案 0 :(得分:1)

当对象实际上不存在时,

tryCatch将适用于列表:

test_list <- list(a = NULL, b = "some_value")
for(i in 1:3){
  obj <- tryCatch({
    x <- test_list[[i]]
    x <- ifelse(is.null(x), NA, x)
  }
  , error = function(e) NA)
  print(obj)
}
[1] NA
[1] "some_value"
[1] NA

显然,谨慎使用。

使用您的代码:

scd[a,paste0("b",".iss..",b)] <- tryCatch({
  x <- sc[["content"]][["abstracts-retrieval-response"]][["item"]][["bibrecord"]][["tail"]][["bibliography"]][["reference"]][[b]][["ref-info"]][["ref-volisspag"]][["voliss"]][["@issue"]]
  x <- ifelse(is.null(x), NA, x)
}, error = function(e) NA)