tidyverseとrlangを組み合わせる

これまで、tidyverseの各パッケージで利用可能な関数について紹介してきました。最期に、tidyverseの関数を組み合わせて独自の関数を定義する際に覚えておくと捗る、rlangパッケージとの連携を導入します。

rlangとは、R言語におけるプログラミングのためのフレームワークとAPIを提供するパッケージの一種です。

library(palmerpenguins)
mtcars |> 
  count(gear) |> 
  ggplot() +
  aes(gear, n) +
  geom_bar(stat = "identity")

diamonds |> 
  count(cut) |> 
  ggplot() +
  aes(cut, n) +
  geom_bar(stat = "identity")

penguins |> 
  count(species) |> 
  ggplot() +
  aes(species, n) +
  geom_bar(stat = "identity")
my_barplot <- function(data, var) {
  data |> 
  count(var) |> 
  ggplot() +
  aes(var, n) +
  geom_bar(stat = "identity")
}
my_barplot(mtcars, gear)
Error in `count()`:
! Must group by variables found in `.data`.
✖ Column `var` is not found.

{{ (カリーカリー)演算子

my_barplot <- function(data, var) {
  data |> 
  count({{ var }}) |> 
  ggplot() +
  aes({{ var }}, n) +
  geom_bar(stat = "identity")
}

my_barplot(mtcars, gear)
my_barplot(diamonds, cut)
my_barplot(penguins, species)
my_barplot <- function(data, var) {
  data |> 
  count({{ var }}) |> 
  ggplot() +
  aes({{ var }}, n) +
  geom_bar(stat = "identity")
}
penguins |> 
  count(species) |> 
  mutate(species = fct_reorder(species, n)) |> 
  ggplot() +
  aes(species, n) +
  geom_bar(stat = "identity")

:=

my_barplot2 <- function(data, var, ...) {
  data |> 
    count({{ var }}) |> 
    mutate({{ var }} := fct_reorder({{ var }}, n)) |> 
    ggplot() +
    aes({{ var }}, n, fill = {{ var }}) +
    geom_bar(stat = "identity",
             show.legend = FALSE,
             ...)
}

my_barplot2(penguins, species)
my_barplot2(penguins, species, fill = "tomato")
library(jmastats)

crossing(year = seq.int(2020, 2022),
         month = seq.int(7, 9),
         block_no = c("47895", "47891", "47887", "47893")) |>
      purrr::pmap(
        function(block_no, year, month, ...) {
          jmastats::jma_collect(item = "monthly",
                                block_no = {{ block_no }},
                                year = {{ year }},
                                month = {{ month }}) |>
            dplyr::mutate(block_no = {{ block_no }})
        }
      ) |>
      dplyr::bind_rows()