R 以整齐的评价变异

R 以整齐的评价变异,r,tidyverse,tidyeval,R,Tidyverse,Tidyeval,使用mutate\(我过去常常提供新变量的列表以及创建它们所需的逻辑 library(dplyr) library(rlang) list_new_var <- list(new_1 = "am * mpg", new_2 = "cyl + disp") mtcars %>% mutate_(.dots = list_new_var) %>% head() 库(dplyr) 图书馆(rlang) 列出新的变量% 变异(.dots=list\u

使用
mutate\(
我过去常常提供新变量的列表以及创建它们所需的逻辑

library(dplyr)
library(rlang)

list_new_var <-
  list(new_1 = "am * mpg",
       new_2 = "cyl + disp")

mtcars %>% 
  mutate_(.dots = list_new_var) %>% 
  head()
库(dplyr)
图书馆(rlang)
列出新的变量%
变异(.dots=list\u new\u var)%>%
总目()
现在我想过渡到使用tidy评估。我正在了解新方法

我怎样才能做到这一点?通常会推荐一个函数来解决这种情况吗

f_mutate <- function(data, new) {

  a <- expr(new)
  b <- eval(new)
  c <- syms(new)
  d <- UQ(syms(new))
  e <- UQS(syms(new))
  f <- UQE(syms(new))

  data %>%
    mutate(f) %>%
    head()

}

f_mutate(mtcars, new = list_new_var)

f_mutate我认为你不需要一个函数。我想你只需要以下几点

library(dplyr)

  mtcars %>% 
  as_tibble() %>% 
  mutate(new_column1 = am * mpg,
         new_column2 = cyl + disp) %>% 
  head()

查看第一个示例。

一个选项是创建一个带有
引号的
列表
,作为参数返回而不进行计算

list_new_var <-list(
   new_1 = quote(am * mpg),
   new_2 = quote(cyl + disp)
)
运行函数

f_mutate(mtcars, new = list_new_var) %>%
      head
#    mpg cyl disp  hp drat    wt  qsec vs am gear carb new_1 new_2
#1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4  21.0   166
#2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4  21.0   166
#3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1  22.8   112
#4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1   0.0   264
#5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2   0.0   368
#6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1   0.0   231

问题是,这些新变量将在某种用户界面中预先指定,因此我希望传入变量创建逻辑,而不是实际创建变量。为供将来参考,另一种实现方法是使用parse_quosure()。我本可以完成rlang_list%lapply(rlang::parse_quosure);mtcars%>%变异(!!!rlang_列表)
f_mutate(mtcars, new = list_new_var) %>%
      head
#    mpg cyl disp  hp drat    wt  qsec vs am gear carb new_1 new_2
#1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4  21.0   166
#2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4  21.0   166
#3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1  22.8   112
#4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1   0.0   264
#5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2   0.0   368
#6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1   0.0   231