整洁的评估,例如mtcars %>% 变异(目标:=日志(目标))

tidy eval with e.g. mtcars %>% mutate(target := log(target))

我在输入问题时想到了这一点,但想看看是否有更简洁、代码更少的方法来做我想做的事情。

例如代码块:

target <- "mpg"

# want
mtcars %>% 
  mutate(target := log(target))

我想将 mpg 更新为基于变量目标的 mpg 日志。

看起来我得到了这个工作:

mtcars %>% 
  mutate(!! rlang::sym(target) := log(!! rlang::sym(target)))

这听起来很重复。是否有 'cleaner'、更少的代码方式来实现相同的结果?

我喜欢双花括号 {{var}},没有原因,它们只是更好读恕我直言,但我尝试时无法得到相同的结果:

mtcars %>% 
  mutate(!! rlang::sym(target) := log({{target}}))

我可以使用 tidyeval 通过基于预先确定的变量的转换来改变字段以定义要转换的字段的各种方法有哪些,在本例中为变量 'target'?

:=lhs上,字符串可以只用!!计算,而在rhs上,它是我们需要的值,所以我们转换为符号并评估 (!!)

library(dplyr)
mtcars %>% 
     mutate(!!target := log(!! rlang::sym(target)))

1) 使用 mutate_at

library(dplyr)
mtcars %>% mutate_at(target, log)

2) 我们可以使用 magrittr %<>% 运算符:

library(magrittr)
mtcars[[target]] %<>% log

3) 当然这在 base R 中是微不足道的:

mtcars[[target]] <- log(mtcars[[target]])