首页 > 解决方案 > tidyeval:将字符串转换为 dplyr 函数中的变量

问题描述

我无法将字符串传递给使用 dplyr 的函数。

首先,我有一个简单的版本,可以产生我想要的输出,但没有按我想要的方式调用。

接下来,我展示了一个版本,在该版本中我以我想调用的方式调用函数,即使该版本不起作用。

这会产生我想要的结果:

car_column <- function(d,Column,Value,Regex) {
 d %>%  
    filter(str_detect(car_name, regex('mazda', ignore_case = TRUE))) %>% 
    rename(Measurement = mpg) %>%  
    select(car_name, Measurement)
}
mtcars %>% 
  tibble::rownames_to_column() %>%  
  rename(car_name = rowname) %>% 
  car_column(car_name, mpg, "mazda")

这段代码调用了我想要调用的函数。请注意,“car_name”在此函数定义中是硬编码的,但应更改为“Column”。

car_column <- function(d,Column,Value,Regex, Statistic) {
 d %>% 
  filter(str_detect(car_name, regex(Regex, ignore_case = TRUE))) %>% 
    rename({{Statistic}}:= {{Value}}) %>% 
  select({{Column}}, {{Statistic}})
}
mtcars %>% 
  tibble::rownames_to_column() %>%  
  rename(car_name = rowname) %>% 
  car_column("car_name", "mpg", "mazda","Measurement")

标签: rfunctiondplyrtidyeval

解决方案


由于输入参数是字符串,将其转换为symbol 并计算 ( !!)

car_column <- function(d,Column,Value,Regex, Statistic) {
 d %>% 
  filter(str_detect(!! rlang::sym(Column), regex(Regex, ignore_case = TRUE))) %>% 
   rename({{Statistic}}:= {{Value}}) %>% 
   select({{Column}}, {{Statistic}})
  }

mtcars %>% 
   tibble::rownames_to_column() %>%  
   rename(car_name = rowname) %>% 
   car_column("car_name", "mpg", "mazda","Measurement")
#       car_name Measurement
#1     Mazda RX4          21
#2 Mazda RX4 Wag          21

推荐阅读