Пользовательская функция без аргументов, в R, в канале

#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. Выполнено. Еще раз спасибо за ваш ответ.