Как извлечь/подмножить элемент из списка с помощью magrittr%>% pipe?

Начиная с введения оператора %>% в пакете magrittr (и он используется в dplyr), я начал использовать его в своей собственной работе.

Одна простая операция меня настораживает. В частности, это извлечение (или подмножество) элементов из списка.

Пример: в базе R я использовал бы $, [ или [[ для извлечения элемента из списка:

iris$Species
iris[["Species"]]

Я могу добиться того же, используя трубу %>%:

iris %>%
  subset(select = "Species") %>%
  head

  Species
1  setosa
2  setosa
3  setosa
4  setosa
5  setosa
6  setosa

или

iris %>%
  `[[`("Species") %>%
  levels

[1] "setosa"     "versicolor" "virginica" 

Однако это похоже на беспорядочное, неуклюжее решение.

Есть ли более элегантный канонический способ извлечь элемент из списка, используя трубу %>%?

Примечание. Мне не нужно решение с dplyr по той простой причине, что я хочу, чтобы решение работало с любым объектом R, включая списки и матрицы, а не только кадры данных.

Ответы

Ответ 1

В v 1.5 магрита на CRAN вы можете использовать оператор %$%:

iris %$% 
  Species %>%
  levels

Это, по существу, обертка вокруг with, но лучше, чем

iris %>% 
  with(Species %>% levels)

или

iris %>%
  with(Species) %>%
  levels

Он предназначен для удобства, когда функции не имеют собственного аргумента данных, например. с сюжетом, который вы можете сделать

iris %>% 
  plot(Sepal.Length ~ Sepal.Width, data = .)

но, например, с ts.plot вы не можете этого сделать, так что теперь:

iris %$%
  ts.plot(Sepal.Length)

[Да, я знаю, что пример не имеет смысла, но он иллюстрирует точку]

Отметим также, что [<- и [[<- также имеют псевдонимы, inset и inset2..

Ответ 2

Используйте use_series, extract2 и extract для $, [[, [ соответственно.

?extract

magrittr предоставляет серию псевдонимов, которые могут быть более приятными для использовать при создании цепей с помощью оператора %>%.

В качестве примера вы можете попробовать

iris %>%
  extract("Species")

и

iris %>%
  extract2("Species") %>%
  levels

Смотрите нижнюю часть этой страницы: http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html