[英]How to mutate a list-column that holds functions by converting strings to functions with the same name that are available in the environment?
我正在構建一個小標題,在其中組織數據對象的名稱(如chr
)以及每個對象的相關爭論 function。
例如,我有一個 function 用於爭論mtcars
和一個 function 用於爭論iris
:
library(dplyr)
wrangle_mtcars <- function() {
mtcars %>%
group_by(am) %>%
summarise(mean_mpg = mean(mpg))
}
wrangle_iris <- function() {
iris %>%
group_by(Species) %>%
summarise(across(starts_with("Sepal"), mean))
}
我想將它們組織在一個看起來像這樣的表格中:
library(tibble)
my_trb <-
tribble(~data_name, ~.fn_wrangling,
"mtcars", wrangle_mtcars,
"iris", wrangle_iris)
my_trb
#> # A tibble: 2 x 2
#> data_name .fn_wrangling
#> <chr> <list>
#> 1 mtcars <fn>
#> 2 iris <fn>
但我不想像上面那樣手動構建my_trb
,而是想以編程方式進行。 也就是說,如果我已經給出了一個包含數據 object 名稱的 1 列表,我想簡單地粘貼一個"wrangle_"
前綴並讓我指的是 function 的小標題“理解”具有相同的全局環境中的名稱。
換句話說,我想從:
given_table <- tibble(data_name = c("mtcars", "iris"))
至
## # A tibble: 2 x 2
## data_name .fn_wrangling
## <chr> <list>
## 1 mtcars <fn>
## 2 iris <fn>
通過執行以下操作:
given_table %>%
mutate(.fn_wrangling = list(paste0("wrangle_", data_name) %>% as.name))
## # A tibble: 2 x 2
## data_name .fn_wrangling
## <chr> <list>
## 1 mtcars <sym> # <----| but I want it to be <fn> as in `my_trb`, not <sym>
## 2 iris <sym> # <----|
但是如果我使用as.function()
而不是as.name()
它會拋出一個錯誤:
given_table %>%
mutate(.fn_wrangling = list(paste0("wrangle_", data_name) %>% as.function))
錯誤:
mutate()
列.fn_wrangling
有問題。
i.fn_wrangling = list(paste0("wrangle_", data_name) %>% as.function)
。
預期 x 列表參數
我們可以使用match.fun
library(dplyr)
given_table %>%
rowwise %>%
mutate(.fn_wrangling = list(match.fun(paste0("wrangle_", data_name)))) %>%
ungroup
# A tibble: 2 × 2
data_name .fn_wrangling
<chr> <list>
1 mtcars <fn>
2 iris <fn>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.