tidyeval:在dplyr函数中将字符串转换为变量

时间:2019-09-13 16:57:45

标签: r function dplyr tidyeval

我无法将字符串传递到使用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”很难 该函数定义中编码,但应更改为“列”。

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")

1 个答案:

答案 0 :(得分:2)

由于输入参数是字符串,请将其转换为sym bol并求值(!!

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