dplyrを使った関数

R tidyverse

dplyrを関数で使うためのメモ

fuuuumin https://fu-om.github.io/ByTheWay/
09-18-2021

dplyrを使った関数

探索的に使うdplyr.

mtcars %>% 
  filter(cyl == 6) %>% 
  rmarkdown::paged_table()

特に問題ない.

my_filter <- function(filter_var, condition, df=mtcars) {
  df %>% 
    filter(filter_var == condition)
}
my_filter(cyl, 6, mtcars) %>% rmarkdown::paged_table()
Problem with `filter()` input `..1`.
x object 'cyl' not found
ℹ Input `..1` is `filter_var == condition`.

どうやら、filter_varを参照している。cylを参照してもらいたい。

enquo()を使う方法

my_filter <- function(filter_var, condition, df=mtcars) {
  filter_var <- enquo(filter_var)
  df %>% 
    filter(!!filter_var == condition)
}
my_filter(cyl, 6, mtcars) %>% rmarkdown::paged_table()

Non Standard Evaluationの詳しい説明

簡単な方法{{}}

my_filter2 <- function(filter_var, condition, df=mtcars) {
  df %>% 
    filter({{filter_var}} == condition)
}
my_filter2(cyl, 6, mtcars) %>% rmarkdown::paged_table()

複数の引数のとき

my_select <- function(df=mtcars, ...) {
  vars <- enquos(...)
  df %>% 
    select(!!!vars)
}
my_select(mtcars, mpg, cyl) %>% rmarkdown::paged_table()