[英]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.