簡體   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