mtext - xlab size r




Pourquoi est-ce que `[` better vaut `subset`? (2)

Lorsque j'ai besoin de filtrer un data.frame, c'est-à-dire extraire des lignes qui répondent à certaines conditions, je préfère utiliser la fonction de subset - subset :

subset(airquality, Month == 8 & Temp > 90)

Plutôt que la [ fonction:

airquality[airquality$Month == 8 & airquality$Temp > 90, ]

Il y a deux raisons principales à ma préférence:

  1. Je trouve que le code se lit mieux, de gauche à droite. Même les personnes qui ne savent rien sur R pourraient dire ce que fait le subset - subset ci-dessus.

  2. Étant donné que les colonnes peuvent être appelées variables dans l'expression select , je peux enregistrer quelques séquences de touches. Dans mon exemple ci-dessus, je n'ai dû saisir airquality seule fois la airquality avec le subset - subset , mais trois fois avec [ .

Donc, je vivais heureux, en utilisant un subset partout parce qu'il est plus court et lit mieux, même en préconisant sa beauté à mes collègues codeurs R. Mais hier, mon monde a éclaté. En lisant la documentation du subset - subset , je remarque cette section:

Attention

C'est une fonction de commodité destinée à être utilisée de manière interactive. Pour la programmation, il est préférable d'utiliser les fonctions standard de sous-ensembles comme [, et en particulier l'évaluation non standard du sous-ensemble d'arguments peut avoir des conséquences imprévues.

Quelqu'un pourrait-il aider à clarifier ce que les auteurs veulent dire?

Premièrement, que veulent-ils dire par " pour une utilisation interactive "? Je sais ce qu'est une session interactive, par opposition à un script exécuté en mode BATCH mais je ne vois pas quelle différence cela devrait faire.

Alors, pourriez-vous s'il vous plaît expliquer " l'évaluation non standard du sous-ensemble des arguments " et pourquoi il est dangereux, peut-être fournir un exemple?


Aussi [ est plus rapide:

require(microbenchmark)        
microbenchmark(subset(airquality, Month == 8 & Temp > 90),airquality[airquality$Month == 8 & airquality$Temp > 90,])
    Unit: microseconds
                                                           expr     min       lq   median       uq     max neval
                     subset(airquality, Month == 8 & Temp > 90) 301.994 312.1565 317.3600 349.4170 500.903   100
     airquality[airquality$Month == 8 & airquality$Temp > 90, ] 234.807 239.3125 244.2715 271.7885 340.058   100

Cette question a été répondue bien dans les commentaires par James, indiquant une excellente explication par Hadley Wickham des dangers du subset - subset (et des fonctions similaires) [here] . Va le lire!

C'est une lecture un peu longue, donc il peut être utile d'enregistrer ici l'exemple que Hadley utilise qui répond le plus directement à la question de "qu'est-ce qui peut mal tourner?":

Hadley suggère l'exemple suivant: supposons que nous voulons sous-ensemble puis réorganiser une trame de données en utilisant les fonctions suivantes:

scramble <- function(x) x[sample(nrow(x)), ]

subscramble <- function(x, condition) {
  scramble(subset(x, condition))
}

subscramble(mtcars, cyl == 4)

Cela renvoie l'erreur:

Erreur dans eval (expr, envir, enclos): objet 'cyl' non trouvé

car R ne "sait" plus où trouver l'objet appelé "cyl". Il souligne également les choses vraiment bizarres qui peuvent arriver si, par hasard, il y a un objet appelé «cyl» dans l'environnement global:

cyl <- 4
subscramble(mtcars, cyl == 4)

cyl <- sample(10, 100, rep = T)
subscramble(mtcars, cyl == 4)

(Courez-les et voyez par vous-même, c'est assez fou.)





r-faq