Операторы тройника, экспозиции и конвейера присваивания для написания чистого кода
Помимо хостинга основного оператора канала% ›%, используемого сообществом Tidyverse, пакет magrittr в Tidyverse содержит еще несколько операторов канала. Канал% ›% широко используется для обработки данных и автоматически загружается с помощью Tidyverse.
Оператор канала используется для выполнения нескольких операций, которые идут последовательно, требуя вывода предыдущей операции в качестве входного аргумента. Итак, выполнение начинается с левой стороны с данными в качестве первого аргумента, который передается в функцию справа и так далее. Таким образом, можно выполнить серию операций с данными за один шаг.
Итак, здесь мы обсудим трех других операторов канала из пакета magrittr. Обсудите области, в которых оператор основного трубопровода не работает, и как эти функции могут его дополнить.
Тройник
Оператор тройника %T>%
работает почти так же, как оператор %>%
, за исключением ситуаций, когда одна из операций в последовательности операций не возвращает значение. Оператор тройника-труба полезен, когда у нас есть функции print () или plot () в серии операций, которые тоже не обязательно в конце последовательности. Поскольку функции print () и plot () не возвращают никакого значения, в этом случае мы можем использовать оператор %T>%
, чтобы использовать последнее значение аргумента, которое будет присвоено операции после операции print () / plot (). Давайте посмотрим на пример, где мы пишем последовательность операций с помощью оператора основного конвейера %>%
.
# sequence of operations using main pipe operator rnorm(100) %>% matrix(ncol=2) %>% sin() %>% plot() %>% colSums() # output Error in colSums(.) : 'x' must be an array of at least two dimensions
Итак, в описанной выше операции мы видим выскакивающую ошибку при выполнении функций colSums (). Это потому, что функция plot () не возвращает никакого значения. Чтобы решить эту проблему, мы будем использовать оператор тройника перед функцией plot (). Это будет передавать значение функции sin () в качестве аргументов функциям plot () и colSums (), таким образом поддерживая поток информации.
Повторение приведенного выше примера с помощью оператора тройника.
# using tee pipe operator rnorm(100) %>% matrix(ncol=2) %>% sin() %T>% plot() %>% colSums() # output [1] 2.372528 -4.902566
Из приведенного выше примера видно, что с помощью оператора тройника выполняется полная последовательность операций.
Экспозиционная труба
Оператор конвейера представления %$%
предоставляет имена переменных фрейма данных слева как соответствующие имена аргументов в функции справа. В некоторых функциях в базе R нет аргумента data =…
. Итак, чтобы ссылаться на переменную из фрейма данных, мы должны использовать оператор $ как dataframe$variable1
и так далее. Таким образом, в этих ситуациях мы имеем дело с несколькими переменными, тогда мы должны повторить процесс использования символа $ с повторением имени фрейма данных. Чтобы этого избежать, можно использовать экспозиционную трубу. Давайте воспользуемся функциями cor () и lm (), чтобы понять использование конвейера экспозиции. Мы будем использовать набор данных mtcars из базы R.
Пример 1 с использованием функции lm ()
с использованием оператора% ›%
mtcars %>% lm(formula = disp~mpg) # output Call: lm(formula = disp ~ mpg, data = .) Coefficients: (Intercept) mpg 580.88 -17.43
с использованием оператора% $%
mtcars %$% lm(formula = disp~mpg) # output Call: lm(formula = disp ~ mpg, data = .) Coefficients: (Intercept) mpg 580.88 -17.43
Пример 2 с использованием функции cor ()
с использованием оператора% ›% (случай 1)
mtcars %>% cor(disp,mpg) # output Error in cor(., disp, mpg) : invalid 'use' argument In addition: Warning message: In if (is.na(na.method)) stop("invalid 'use' argument") : the condition has length > 1 and only the first element will be used
с использованием оператора% ›% (случай 2)
cor(mtcars$disp,mtcars$mpg) # output [1] -0.8475514
с использованием оператора% $%
mtcars %$% cor(disp, mpg) # output [1] -0.8475514
В примере 1 мы видим, что независимо от типа используемого оператора канала, две операции с использованием двух разных каналов работают отлично. Но в примере 2 работает случай 2 операторов% ›% и% $%. Ключевое различие здесь заключается в типе аргументов функций lm () и cor (). Функция lm () имеет данные в качестве одного из аргументов, а функция cor () — нет. Итак, операторы каналов% ›% и% $% отлично работают с функцией lm (). Для случая функции cor (), поскольку аргумент — либо x, либо y (проверьте документацию). Итак, мы должны явно указать значения x и y, которые должны поступать из фрейма данных mtcars, определив аргументы x и y как mtcars $ disp и mtcars $ mpg. Поэтому, чтобы избежать повторения фрейма данных mtcars, мы можем напрямую использовать оператор канала% $%.
Канал назначения
Последний из менее известных каналов — канал назначения %<>%
. Канал используется, когда переменная присваивается самой себе после выполнения определенных операций. Давайте посмотрим на пример
a <- a %>% cos() %>% sin() # using assignment operator a %<>% cos() %>% sin()
Итак, используя оператор конвейера присваивания, мы можем удалить оператор присваивания <-
.
Вывод
Мы исследовали трех менее известных операторов трубок: тройников, экспозиций и назначений из пакета magrittr в Tidyverse. Кроме того, мы реализовали эти операторы трубы в различных настройках, чтобы увидеть, как они дополняют работу оператора основной трубы,% ›%.
Тройник% T ›% полезен, когда в серии операций есть функция, которая не возвращает никакого значения. В случае конвейера экспозиции% $% они удобны с базовыми функциями R, не имеющими данных в качестве аргумента. А конвейер присвоения% ‹›% избегает повторения, когда переменная присваивается самой себе после серии операций.
Спасибо за чтение. Надеюсь, вам понравились функциональные возможности трубы. Пожалуйста, дайте мне знать, если у вас есть какие-либо отзывы.
Использованная литература:
- Https://magrittr.tidyverse.org/articles/magrittr.html
- Https://r4ds.had.co.nz/pipes.html
- Https://magrittr.tidyverse.org/reference/exposition.html
Вы можете связаться со мной в LinkedIn и Twitter, чтобы следить за моим путешествием по науке о данных и визуализации данных.