ある関数のデフォルト引数がある引数のみを、そのデフォルト引数とともに抜く

例えばここにこんな関数があったとする。

f <- function(x, y = 100, args = list()){
  y
}

そしてこの関数のデフォルト引数がある引数のみを、そのデフォルト引数とともに抜きたいと思うことがある、俺にはある。 こういう処理をしてくれる関数 get_default_args が欲しいということだ

> get_default_args(f)
$y
[1] 100

$args
list()

このような関数は以下のように実装することができる。 詳細はCodeコメントを読んで欲しい。

get_default_args <- function(func){
  # formalsで引数とデフォルト引数をまとめてとれる。ただしpairlist型なので無理やりlistにする
  x <- as.list(formals(func))
  # デフォルト引数のない引数(上のk名数fでいうx)はnameオブジェクトと判定されるので、それ以外(デフォルト引数ある引数)をもってくる
  has_default_value <- purrr::map_lgl(x, ~ !is.name(.x))
  purrr::keep(x, has_default_value)
}