eval(parse(text=...))をモダンに書きたい
掲題の件、 eval(parse(text=...))をモダンな書き方にしたいと思って、r-wakalangで回答貰ったやつのメモ。
昔ながら(一部、purrr使ってるんでモダンにも見えるが・・・)の書き方だとこんなん
> hoge1 <- function(x){x+1} > hoge2 <- function(x){x+2} > > purrr::map(paste0("hoge", 1:2), ~ eval(parse(text=.x))(1)) [[1]] [1] 2 [[2]] [1] 3
これをモダンに書こうとすると、以下のようにするのが良いらしい
> purrr::map(paste0("hoge", 1:2), ~ rlang::eval_tidy(rlang::sym(.x))(1)) [[1]] [1] 2 [[2]] [1] 3 > purrr::invoke_map(rlang::set_names(c("hoge1", "hoge2")), 1) $hoge1 [1] 2 $hoge2 [1] 3
非常に勉強になった。
〜追記〜
後に教えてもらった以下が一番きれいかも。
> list(hoge1, hoge2) %>% + map(~ .(iris)) %>% + bind_rows() Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 5.9 3.0 5.1 1.8 virginica