dplyr / tidyevaluation: как передать выражение в mutate в виде строки? - PullRequest
0 голосов
/ 25 мая 2018

Я хочу написать функцию, которая имеет два входа: имя новой переменной и математическое выражение.Оба аргумента представлены в виде строк.

Эта функция должна взять data.frame и добавить указанную новую переменную, которая должна быть результатом данного математического выражения.

Это минимальный рабочий примерто, что я пробовал:

df <- tibble(A = 1:10, B = 1:10)
new_var <- "C"
expression <- "A + B"


example_fun <- function(new_var, expression) {
  new_var_sym <- sym(new_var)
  expression_sym <-  sym(expression)

  mutate(df, !! new_var_sym := !! expression_sym)
}

example_fun(new_var, expression)

Это приводит к следующей ошибке:

Error in mutate_impl(.data, dots) : Binding not found: A + B.

Когда я обертываю строку мутирования внутри функции сexpr(), я получаю

mutate(df, `:=`(C, `A + B`))

Кажется, что галочки вокруг A + B не должны быть там, но я не мог понять, как избавиться от них.По крайней мере, enquo() и quo_name() не помогли.

1 Ответ

0 голосов
/ 25 мая 2018

Мы можем использовать выражение / цитату в качестве выражения и затем выполнить оценку (!!).Кроме того, lhs := может принимать строку, поэтому нам не нужно преобразовывать 'new_var' в символ

library(tidyverse)
library(rlang)

expression <- quo(A + B)
example_fun <- function(new_var, expression) {


  df %>% 
      mutate(!! new_var := !! expression)
}

example_fun(new_var, expression)
# A tibble: 10 x 3
#       A     B     C
#   <int> <int> <int>
# 1     1     1     2
# 2     2     2     4
# 3     3     3     6
# 4     4     4     8
# 5     5     5    10
# 6     6     6    12
# 7     7     7    14
# 8     8     8    16
# 9     9     9    18
#10    10    10    20

Если мы действительно хотим передать как character строки,затем используйте parse_expr

expression <- "A + B"
example_fun <- function(new_var, expression) {


  df %>%
     mutate(!! new_var := !! parse_expr(expression))
}

example_fun(new_var, expression)
# A tibble: 10 x 3
#       A     B     C
#   <int> <int> <int>
# 1     1     1     2
# 2     2     2     4
# 3     3     3     6
# 4     4     4     8
# 5     5     5    10
# 6     6     6    12
# 7     7     7    14
# 8     8     8    16
# 9     9     9    18
#10    10    10    20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...