Tidy Evaluation не работает с mutate и stringr - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь использовать 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 не поддерживает аккуратное вычисление или оператор фигурных / кудрявых ({{}}) ??

1 Ответ

2 голосов
/ 23 апреля 2020

Tidy оценка полностью зависит от того, как вы отправляете свои материалы.

Например, если вы отправите свой ввод как переменную без кавычек, ваша попытка будет успешной.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...