2016-12-12 5 views
1

Ich Schleife durch eine verschachtelte Schleife, aber nicht sicher, wie Sie damit umgehen, wenn ein Index keine Daten hat.R wenn Fehler für den Index außerhalb der Grenzen

Zum Beispiel:

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

ich tun kann:

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

jedoch folgendes nicht:

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

Ich kann es einfach nicht wickeln in einem if(is.null(...)){"Null"}else{...} wie ich zuvor getan hatte, .

Gibt es generische wenn Fehler oder ist Fehler Funktion, die einen Wert geben würde, immer wenn ich den Index außerhalb der Grenzen Fehler bekomme? Dies ist für das obige Beispiel möglicherweise nicht erforderlich, aber meine Daten sind ein wenig komplizierter und ich weiß nicht, wie ich sie replizieren kann, sondern was ich versuche zu durchlaufen, wie es aussieht, wenn es leer ist und wann es ein Ergebnis gibt :

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() 

Ergebnis:

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

Antwort

2

Normalerweise würden Sie tryCatch für die Fehlerbehandlung verwenden. wenn subsetting führt zu einem Fehler ein Beispiel, wo NA gedruckt wird:

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

PS: in einer Schleife ein Objekt wächst, wie Sie in Ihrem realen Code zu tun scheinen eine Kardinal Leistung Sünde. Vorabzuweisen.

PPS: Statt die Fehler der Handhabung, könnte es besser sein, es zu vermeiden, zum Beispiel durch die Längen Überprüfung: A[lengths(A) > 1]

+0

Danke, ich versuche, versuche aber weiß nicht, TryCatch – Olivia

Verwandte Themen