393 votes

Dans R, pourquoi `[` better vaut `subset`?

Quand j'ai besoin de filtrer les données.le cadre, c'est à dire, d'en extraire les lignes qui répondent à certaines conditions, je préfère utiliser l' subset fonction de:

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

plutôt que de l' [ fonction de:

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

Il ya deux raisons principales pour ma préférence:

  1. - Je trouver le code se lit mieux, de gauche à droite. Même les gens qui ne savent rien au sujet de la R pouvait dire ce que l' subset déclaration ci-dessus est en train de faire.
  2. Car les colonnes peuvent être appelées variables dans l' select expression, je peux économiser quelques frappes. Dans mon exemple ci-dessus, je n'avais qu'à taper airquality une fois avec de l' subset, mais trois fois avec de l' [.

Donc, je vivais heureux, à l'aide de subset partout, parce qu'elle est plus courte et se lit mieux, même plaider sa beauté à mes collègues R codeurs. Mais hier, mon monde s'est disloquée. Lors de la lecture de l' subset de la documentation, je remarque cette section:

Avertissement

C'est une fonction de commodité prévu pour une utilisation interactive. Pour la programmation, il est préférable d'utiliser la norme. comme les fonctions [, et en particulier du non-standard de l'évaluation de l'argument sous-ensemble peuvent avoir des conséquences imprévues.

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

Tout d'abord, que veulent-ils dire par "pour une utilisation interactive"? Je sais ce qu'est une session interactive est, par opposition à un script de s'exécuter en mode BATCH, mais je ne vois pas quelle différence il doit faire.

Alors, pouvez-vous expliquer "le non-standard de l'évaluation de l'argument sous-ensemble" et pourquoi il est dangereux, peut-être donner un exemple?

Merci!!!!

237voto

joran Points 68079

Cette question a été répondue en bien dans les commentaires de @James, en montrant une excellente explication par le Hadley Wickham des dangers de l' subset (et fonctionne comme ça) [ici]. Allez le lire!

C'est un peu long de la lecture, de sorte qu'il peut être utile de noter ici l'exemple que Hadley utilise que la plupart traite directement de la question de "ce qui peut aller mal?":

Hadley suggère l'exemple suivant: supposons que l'on souhaite sous-ensemble et puis 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)

Ceci renvoie l'erreur:

Erreur dans la fonction eval(expr, envir, enclos) : l'objet " cyl " introuvable

parce que R n'est plus "sait" où trouver de l'objet appelé "cyl'. Il souligne aussi le vraiment des trucs bizarres qui peuvent se produire si, par chance, il y a un objet appelé " cyl " dans l'environnement mondial:

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

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

(Les exécuter et de voir par vous-même, c'est assez fou.)

29voto

bartektartanus Points 2472

Aussi `` est plus rapide :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X