Как извлечь/подмножить элемент из списка с помощью 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