#r #function #pipe
#r #функция #канал
Вопрос:
Я хотел бы написать функцию, у которой нет аргументов, и на которую можно ссылаться в канале (%>%), поэтому мне не нужно повторять несколько строк кода. Однако я не получаю ее после нескольких попыток. Я также был бы признателен за помощь в написании функции, на которую ссылается канал, с аргументами. Большое спасибо за любую помощь! Упрощенный пример следует:
library(tidyverse)
a <- c(1:10)
b <- c(11:20)
c <- data.frame(a, b)
c
#> a b
#> 1 1 11
#> 2 2 12
#> 3 3 13
#> 4 4 14
#> 5 5 15
#> 6 6 16
#> 7 7 17
#> 8 8 18
#> 9 9 19
#> 10 10 20
y <- function() {
filter(d<5)
}
c %>% mutate(d = a*b) %>% y()
#> Error in y(.): unused argument (.)
Создана 2020-08-16 пакетом reprex (версия 0.3.0)
Ответ №1:
канал считает, что первым аргументом функции являются данные, например, первыми аргументами mutate или filter являются данные. Итак, когда вы делаете, mtcars %>% mutate(a = 5)
вы на самом деле делаете mutate(mtcars, a = 5)
.
Поэтому вам пришлось бы изменить ее на:
y <- function(data) {
filter(data, d < 80)
}
c %>% mutate(d = a*b) %>% y()
a b d
1 1 11 11
2 2 12 24
3 3 13 39
4 4 14 56
5 5 15 75
Комментарии:
1. Да, это сработало бы. Извините, мой пример был недостаточно ясен в попытке быть слишком простым. В моем модифицированном примере не имеет значения, ссылаюсь я на c или нет в функции. Проблема в том, как мне ссылаться на данные после того, как они были изменены серией команд?
2.Я не уверен, что понял, чего вы хотите, но выполнение того же способа, которым я ответил, все равно будет работать с вашим примером:
y <- function(data) { filter(data, d < 80) }
c %>% mutate(d = a*b) %>% y()
. в этом случае y () получит измененный c в качестве первого аргумента.3. Да, это работает так, как мне нужно, большое спасибо! Я не совсем понимаю теорию, лежащую в основе того, что было необходимо, но я могу использовать ваш ответ для решения моей проблемы.
4. @David вы можете взглянуть на: r4ds.had.co.nz/pipes.html
5. Выполнено. Еще раз спасибо за ваш ответ.