2016-12-12 4 views
1

Я зацикливаюсь в вложенном цикле, но не уверен, как бороться, когда один индекс не имеет никаких данных.R, если ошибка для индекса за пределами

Например:

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{...} как я делал ранее ,

Есть ли какая-либо общая функция, если ошибка или функция ошибки, которая даст значение всякий раз, когда я получаю ошибку индекса за пределами границ? Это может не понадобиться для приведенного выше примера, но мои данные немного сложнее, и я не знаю, как его реплицировать, но покажу, что я пытался пропустить, как он выглядит, когда он пуст, и когда есть результат :

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} 

Empty:

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] "..." 

ответ

2

Как правило, вы будете использовать tryCatch для обработки ошибок. Пример, где NA печатается, если результаты Подменю с ошибкой:

for(i in seq_along(A)){ 
    tryCatch(print(A[[i]][[2]]), 
      error = function(e) print(NA)) 
} 
#[1] 2 
#[1] NA 
#[1] 5 

PS: Растущий объект в цикле, как вы, кажется, делать в реальном коде является производительность смертным грехом. Научитесь предварительно распределять.

PPS: Вместо обработки ошибки, это может быть лучше, чтобы избежать этого, например, путем проверки длины: A[lengths(A) > 1]

+0

Спасибо, я пытался попробовать, но не знал tryCatch – Olivia

Смежные вопросы