繁体   English   中英

如何通过将字符串转换为环境中可用的同名函数来改变包含函数的列表列?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM