R如果下标超出界限的错误

时间:2016-12-12 11:24:29

标签: r if-statement error-handling

我循环嵌套循环但不确定当一个索引没有任何数据时如何处理。

例如:

A <- list(list(1,2), list(2), list(4,5))

我能做到:

for(i in 1:length(A)){print(A[[i]][[1]])}
[1] 1
[1] 2
[1] 4

然而以下失败:

for(i in 1:length(A)){print(A[[i]][[2]])}
[1] 2
Error in A[[i]][[2]] : subscript out of bounds

我不能像以前那样简单地将它包裹在if(is.null(...)){"Null"}else{...}中。

是否有任何泛型if错误或错误函数,只要我得到下标超出边界错误就会给出一个值?上面的例子可能不需要这个,但我的数据有点复杂,我不知道如何复制它,但会显示我试图循环的内容,空的时候和结果时的样子:

for(i in 1:x$count){z=rbind.fill(z,data.frame(data=if(is.null(x$results[[i]]$experiences[[1]]$experience$A)){"Null"}else{x$results[[i]]$experiences[[1]]$experience$A}

空:

x$results[[4]]$experiences
list()

结果:

x$results[[3]]$experiences
[[1]]
[[1]]$experience
[[1]]$experience$start
[1] "..."

[[1]]$experience$A
[1] "..."

[[1]]$experience$B
[[1]]$experience$B$A
[1] "..."


[[1]]$experience$C
[[1]]$experience$C$A
NULL

[[1]]$experience$C$B
NULL

[[1]]$experience$C$C
NULL



[[1]]$`_meta`
[[1]]$`_meta`$weight
[1] 1

[[1]]$`_meta`$`_sources`
[[1]]$`_meta`$`_sources`[[1]]
[[1]]$`_meta`$`_sources`[[1]]$`_origin`
[1] "..."





[[2]]
[[2]]$experience
[[2]]$experience$start
[1] "..."

[[2]]$experience$A
[1] "..."

[[2]]$experience$B
[[2]]$experience$B$C
[1] "..."


[[2]]$experience$C
[[2]]$experience$C$A
NULL

[[2]]$experience$C$B
NULL

[[2]]$experience$C$C
NULL



[[2]]$`_meta`
[[2]]$`_meta`$weight
[1] 1

[[2]]$`_meta`$`_sources`
[[2]]$`_meta`$`_sources`[[1]]
[[2]]$`_meta`$`_sources`[[1]]$`_origin`
[1] "..."





[[3]]
[[3]]$experience
[[3]]$experience$start
[1] "..."

[[3]]$experience$A
[1] "..."

[[3]]$experience$B
[[3]]$experience$B$A
[1] "..."


[[3]]$experience$C
[[3]]$experience$C$A
NULL

[[3]]$experience$C$B
NULL

[[3]]$experience$C$C
NULL



[[3]]$`_meta`
[[3]]$`_meta`$weight
[1] 1

[[3]]$`_meta`$`_sources`
[[3]]$`_meta`$`_sources`[[1]]
[[3]]$`_meta`$`_sources`[[1]]$`_origin`
[1] "..."

1 个答案:

答案 0 :(得分:2)

通常,您使用NA进行错误处理。例如,如果子集导致错误,则打印for(i in seq_along(A)){ tryCatch(print(A[[i]][[2]]), error = function(e) print(NA)) } #[1] 2 #[1] NA #[1] 5

A[lengths(A) > 1]

PS:在你真实的代码中看起来像在循环中增长一个对象是一个基本的性能罪。学习预分配。

PPS:最好不要处理错误,例如通过检查长度来避免错误:{{1}}