Pourquoi “ `mieux que` sous-ensemble`?

Lorsque je dois filtrer un data.frame, c’est-à-dire extraire des lignes répondant à certaines conditions, je préfère utiliser la fonction de subsetsubset :

 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 à propos de R peuvent dire ce que fait la déclaration ci-dessus.

  2. Étant donné que les colonnes peuvent être appelées variables dans l’expression de select , je peux enregistrer quelques séquences de touches. Dans mon exemple ci-dessus, je n’ai eu qu’à taper airquality une fois avec subsetsubset , mais trois fois avec [ .

Donc, je vivais heureux, en utilisant un subset partout car il est plus court et lit mieux, préconisant même sa beauté pour mes collègues codeurs R. Mais hier mon monde s’est séparé. En lisant la documentation du subsetsubset , je remarque cette section:

Attention

Ceci est une fonction pratique destinée à être utilisée de manière interactive. Pour la programmation, il est préférable d’utiliser les fonctions de sousensemble standard 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 signifient les auteurs?

Premièrement, que signifient-ils 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 d’arguments ” et pourquoi il est dangereux, peut-être fournir un exemple?

Cette question a été bien répondue dans les commentaires de @James, soulignant une excellente explication de Hadley Wickham sur les dangers du subsetsubset (et de ses fonctions) [ici] . Allez le lire!

C’est un peu long à lire, donc il peut être utile d’enregistrer ici l’exemple que Hadley utilise qui aborde le plus directement la question de «qu’est-ce qui peut mal tourner»:

Hadley suggère l’exemple suivant: supposons que nous voulions sous-ensembles et réorganiser un bloc 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): object 'cyl' non trouvé

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

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

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

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