2014-12-08 13 views
17

Ho un piccolo problema con R e non sono sicuro del perché. Mi sta dicendo che questa linea: if(temp > data[[k]][[k2]]) { è di lunghezza di argomento 0. Qui è il blocco che non è poi così grande:R - l'argomento è di lunghezza zero in se istruzione

for(k in 1:length(data)) { 
     temp <- 0 
     for(k2 in 3:length(data[[k]])) { 
      print(data[[k]][[k2]]) 
      if(temp > data[[k]][[k2]]) { 
       temp <- data[[k]][[k2]] 
      } 
      fMax[k] <- temp 
      k2 <- k2 + 1 
     } 
k <- k + 1 
} 

esempio di ciò che è nei dati [[k]] [[k2]]:

[1] "3050" 
[1] "3051" 
[1] "3054" 
[1] "3054" 
[1] "3052" 
[1] "3053" 
[1] "3059" 
[1] "3059" 
[1] "3057" 
[1] "3060" 
[1] "3063" 
[1] "3060" 
[1] "3068" 
[1] "3067" 
[1] "3079" 
[1] "3085" 
[1] "3094" 
[1] "3107" 
[1] "3121" 
[1] "3135" 
[1] "3147" 
[1] "3161" 
[1] "3200" 
[1] "3237" 
[1] "3264" 
[1] "3274" 
[1] "3284" 
[1] "3289" 
[1] "3292" 
[1] "3300" 
[1] "3301" 
[1] "3303" 
[1] "3306" 
[1] "3310" 
[1] "3312" 
[1] "3313" 
[1] "3319" 
[1] "3314" 
[1] "3318" 
[1] "3318" 
[1] "3320" 
[1] "3322" 
[1] "3322" 
[1] "3322" 
[1] "3328" 
[1] "3332" 
[1] "3338" 
[1] "3350" 
[1] "3358" 
[1] "3378" 
[1] "3395" 
[1] "3402" 
[1] "3875" 
[1] "3950" 
[1] "3988" 
[1] "4018" 
[1] "4039" 
[1] "4048" 
[1] "4057" 
[1] "4062" 
[1] "4067" 
[1] "4076" 
[1] "4082" 
[1] "4085" 
[1] "4092" 
[1] "4098" 
[1] "4099" 
[1] "4101" 
[1] "4107" 
[1] "4119" 
[1] "4139" 
[1] "4164" 
[1] "4231" 
[1] "4347" 
[1] "4559" 

Grazie - Sam

+0

Ho provato un po 'a riprodurre, ma non è riuscito. Prova a impostare 'options (error = recover)' per scaricarti nel browser quando colpisci l'errore. Quindi stampa 'k' e' k2' e guarda attentamente il caso che ti mette nei guai. –

+2

Dovresti davvero pubblicare un [esempio riproducibile] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) con input di esempio e output desiderato che può essere copiato/incollato su R. Inoltre, descrivi cosa stai cercando di fare invece di pubblicare solo il codice non funzionante; potrebbe esserci un modo migliore per farlo. Ma il tuo codice è terribilmente strano avere un ciclo 'for' su' k2' e anche così incrementare manualmente il valore. – MrFlick

+0

Va bene, lo metto come una risposta con una buona spiegazione, se la sua confusione mi consente di sapere anche se non sono il migliore nelle spiegazioni. – user3558177

risposta

49

"argomento è di lunghezza zero" è un problema molto specifico che viene da uno dei miei elementi meno apprezzato di R. Fammi dimostrare il problema:

> FALSE == "turnip" 
[1] FALSE 
> TRUE == "turnip" 
[1] FALSE 
> NA == "turnip" 
[1] NA 
> NULL == "turnip" 
logical(0) 

Come si può vedere, i confronti con un valore NULL non solo non generano un valore booleano, non generano alcun valore e i flussi di controllo tendono ad aspettarsi che un controllo produca un tipo di output. Quando producono un output a lunghezza zero ... "l'argomento è di lunghezza zero".

(ho un tempo molto lungo sproloquio sul perché questo mi fa infuriare così tanto Può aspettare..)

Quindi, la mia domanda; qual è l'output di sum(is.null(data[[k]]))? Se non è 0, avete valori NULL incorporato nel set di dati e necessario rimuovere le righe rilevanti, o modificare il controllo per

if(!is.null(data[[k]][[k2]]) & temp > data[[k]][[k2]]){ 
    #do stuff 
} 

Speriamo che aiuta; è difficile dirlo senza l'intero set di dati. Se non aiuta, e il problema non è un valore NULL che arriva da qualche parte, temo di non averne idea.

+0

In alternativa, guardando il codice: si sta eseguendo il ciclo con "for" e incrementando. Il risultato è probabilmente che finirai per fare riferimento a indici di dati [[k]] che non esistono. Utilizzare un ciclo for oppure incrementare con un ciclo while, non entrambi; perché i cicli aumentano autonomamente. –

+0

Va bene grazie, contrassegnato come risposta. – user3558177

+4

btw, dove andiamo a leggere il rant? –

2

Lo stesso messaggio di errore risulta non solo per null ma anche per es. factor(0). In questo caso, la query deve essere if(length(element) > 0 && otherCondition) oppure controllare entrambi i casi con if(!is.null(element) && length(element) > 0 && otherCondition).

Problemi correlati