Tidy Evaluation 不适用于 mutate 和 stringr

Tidy Evaluation not working with mutate and stringr

我试图在 mutate 管道中同时使用 Tidy Eval 和 Stringr,但每次我 运行 它都会给我一个不希望的结果。 它没有将字母 'a' 更改为字母 'X',而是用列名称覆盖整个向量,如下例所示,它使用了 IRIS 数据集。

text_col="Species"
iris %>% 
  mutate({{text_col}} := str_replace_all({{text_col}}, pattern = "a", replacement = "X"))

结果:

    structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, 
5, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8), Sepal.Width = c(3.5, 3, 
3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3, 3, 4), Petal.Length = c(1.4, 
1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 1.1, 
1.2), Petal.Width = c(0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 
0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2), Species = c("Species", "Species", 
"Species", "Species", "Species", "Species", "Species", "Species", 
"Species", "Species", "Species", "Species", "Species", "Species", 
"Species")), row.names = c(NA, 15L), class = "data.frame")

Stringr 不支持 tidy 求值或 curly-curly ({{}}) 运算符吗??

整洁的评估完全取决于您如何发送输入。

例如,如果您将输入作为未加引号的变量发送,您的尝试就会成功。

library(dplyr)
library(stringr)
library(rlang)

change_fun <- function(df, text_col) {
  df %>%  mutate({{text_col}} := str_replace_all({{text_col}}, "a","X"))
}

change_fun(iris, Species) %>% head

#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1          5.1         3.5          1.4         0.2  setosX
#2          4.9         3.0          1.4         0.2  setosX
#3          4.7         3.2          1.3         0.2  setosX
#4          4.6         3.1          1.5         0.2  setosX
#5          5.0         3.6          1.4         0.2  setosX
#6          5.4         3.9          1.7         0.4  setosX

要将输入作为带引号的变量传递,请先使用 sym 转换为符号,然后计算 !!

change_fun <- function(df, text_col) {
   df %>%  mutate(!!text_col := str_replace_all(!!sym(text_col), "a","X"))
}

change_fun(iris, "Species") %>% head

#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1          5.1         3.5          1.4         0.2  setosX
#2          4.9         3.0          1.4         0.2  setosX
#3          4.7         3.2          1.3         0.2  setosX
#4          4.6         3.1          1.5         0.2  setosX
#5          5.0         3.6          1.4         0.2  setosX
#6          5.4         3.9          1.7         0.4  setosX