Depuis l'introduction du %>%
dans le package magrittr
(et son utilisation dans dplyr
), j'ai commencé à l'utiliser dans mon propre travail.
Une opération simple m'a cependant déconcerté. Plus précisément, il s'agit de l'extraction (ou du sous-ensemble) d'éléments d'une liste.
Un exemple: dans la base R, j'utiliserais $
, [
ou [[
pour extraire un élément d'une liste:
iris$Species
iris[["Species"]]
Je peux obtenir le même résultat en utilisant le %>%
pipe:
iris %>%
subset(select = "Species") %>%
head
Species
1 setosa
2 setosa
3 setosa
4 setosa
5 setosa
6 setosa
Ou
iris %>%
`[[`("Species") %>%
levels
[1] "setosa" "versicolor" "virginica"
Cependant, cela ressemble à une solution désordonnée et maladroite.
Existe-t-il un moyen plus élégant et canonique d'extraire un élément d'une liste en utilisant le %>%
pipe?
Remarque: Je ne veux aucune solution impliquant dplyr
, pour la simple raison que je veux que la solution fonctionne avec n'importe quel objet R, y compris les listes et les matrices, pas seulement les trames de données.
Dans la version 1.5 de magrittr sur CRAN, vous pouvez utiliser le %$%
opérateur:
iris %$%
Species %>%
levels
C'est essentiellement un wrapper autour de with
mais plus agréable que
iris %>%
with(Species %>% levels)
ou
iris %>%
with(Species) %>%
levels
Il est conçu pour être pratique lorsque les fonctions n'ont pas leur propre argument de données, par exemple avec l'intrigue que vous pouvez faire
iris %>%
plot(Sepal.Length ~ Sepal.Width, data = .)
mais par exemple avec ts.plot
vous ne pouvez pas faire ça, alors maintenant:
iris %$%
ts.plot(Sepal.Length)
[ouais, je sais que l'exemple n'a aucun sens, mais il illustre le point]
Notez également que [<-
et [[<-
ont également des alias, inset
et inset2
..
Utilisation use_series
, extract2
et extract
pour $
, [[
, [
, respectivement.
?extract
magrittr fournit une série d'alias qui peuvent être plus agréables à utiliser lors de la composition de chaînes à l'aide du
%>%
opérateur. "
Pour votre exemple, vous pouvez essayer
iris %>%
extract("Species")
et
iris %>%
extract2("Species") %>%
levels
Voir le bas de cette page pour plus: http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html
Une solution tidyverse
plus récente: pluck()
de purrr
(depuis 0.2.3) extrait un élément nommé d'une liste (ou une colonne nommée d'un bloc de données):
library(tidyverse)
iris %>%
pluck("Species")
Remarque: pour accéder à l'élément par numéro d'index, vous pouvez également utiliser first()
, last()
ou nth()
à partir de dplyr
sur n'importe quel objet (liste, trame de données, matrice) pour extraire son premier, dernier ou nième élément:
iris %>%
as.list() %>% # unnecessary, just to show it works on lists too
last() # or nth(5) in this case, to get Species