简体   繁体   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?

I'm building a tibble in which I organize names (as chr ) of data objects and the relevant wrangling function for each one.我正在构建一个小标题,在其中组织数据对象的名称(如chr )以及每个对象的相关争论 function。

For example, I have one function for wrangling mtcars and one function for wrangling iris :例如,我有一个 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))
}

And I want to organize them in a table that looks like that:我想将它们组织在一个看起来像这样的表格中:

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>

But instead of building my_trb manually as I did above, I want to do it programmatically .但我不想像上面那样手动构建my_trb ,而是想以编程方式进行。 That is, if I'm already given a 1-column table with the name of the data object, I want to simply paste a "wrangle_" prefix and have the tibble "understand" that I'm referring to the function with the same name that is in the global environment.也就是说,如果我已经给出了一个包含数据 object 名称的 1 列表,我想简单地粘贴一个"wrangle_"前缀并让我指的是 function 的小标题“理解”具有相同的全局环境中的名称。

In other words I want to get from:换句话说,我想从:

given_table <- tibble(data_name = c("mtcars", "iris"))

to

## # A tibble: 2 x 2
##   data_name .fn_wrangling
##   <chr>     <list>       
## 1 mtcars    <fn>         
## 2 iris      <fn>  

By doing something like:通过执行以下操作:

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>  # <----|

But if I use as.function() instead of as.name() it throws an error:但是如果我使用as.function()而不是as.name()它会抛出一个错误:

given_table %>%
  mutate(.fn_wrangling = list(paste0("wrangle_", data_name) %>% as.function))

Error: Problem with mutate() column .fn_wrangling .错误: mutate().fn_wrangling有问题。
i .fn_wrangling = list(paste0("wrangle_", data_name) %>% as.function) . i .fn_wrangling = list(paste0("wrangle_", data_name) %>% as.function)
x list argument expected预期 x 列表参数

We could use match.fun我们可以使用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