R-argument est de longueur zéro dans l'instruction if

J'ai un petit problème avec R et je ne sais pas pourquoi. Il me dit que cette ligne: if(temp > data[[k]][[k2]]) { est de longueur d'argument 0. Voici le bloc qui n'est pas si grand:

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
 }

Exemple de ce qui est dans les données[[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"

Merci-Sam

25
r
demandé sur user3558177 2014-12-08 05:46:55

2 réponses

"argument est de longueur Zéro" est un problème très spécifique qui vient de l'un de mes éléments les moins aimés de R. permettez-moi de démontrer le problème:

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

Comme vous pouvez le voir, les comparaisons avec un NULL ne produisent pas seulement une valeur booléenne , elles ne produisent pas du tout de valeur-et les flux de contrôle ont tendance à s'attendre à ce qu'une vérification produise un type de sortie. Quand ils produisent une sortie de longueur nulle... "l'argument est de longueur zéro".

(j'ai une très longue diatribe sur pourquoi cela m'exaspère tellement. Il peut attendre.)

Donc, ma question; Quelle est la sortie de sum(is.null(data[[k]]))? Si ce n'est pas 0, Vous avez des valeurs NULL intégrées dans votre ensemble de données et devrez soit supprimer les lignes pertinentes, soit changer la vérification en

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

J'espère que cela aide; c'est difficile à dire sans l'ensemble de données entier. Si cela n'aide pas, et que le problème n'est pas une valeur nulle entrant quelque part, j'ai peur de ne pas en avoir la moindre idée.

63
répondu Oliver Keyes 2014-12-08 04:23:13

Le même message d'erreur se produit non seulement pour null mais aussi pour par exemple factor(0). Dans ce cas, la requête doit être if(length(element) > 0 && otherCondition) ou vérifier les deux cas avec if(!is.null(element) && length(element) > 0 && otherCondition).

6
répondu SommerEngineering 2017-10-13 09:32:23