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
我试图在 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