Koo*_*opa 5 evaluation expression r dplyr non-standard-evaluation
我想根据给定的字符向量添加一个新列。例如,在下面的示例中,我想添加d在中定义的列expr:
library(magrittr)
data <- tibble::tibble(
a = c(1, 2),
b = c(3, 4)
)
expr <- "d = a + b"
Run Code Online (Sandbox Code Playgroud)
如下:
data %>%
dplyr::mutate(d = a + b)
# # A tibble: 2 x 3
# a b d
# <dbl> <dbl> <dbl>
# 1 1 3 4
# 2 2 4 6
Run Code Online (Sandbox Code Playgroud)
然而,在下面的代码中,虽然计算本身(即添加)有效,但新列的名称与我的预期不同。
data %>%
dplyr::mutate(!!rlang::parse_expr(expr))
# # A tibble: 2 x 3
# a b `d = a + b`
# <dbl> <dbl> <dbl>
# 1 1 3 4
# 2 2 4 6
data %>%
dplyr::mutate(!!rlang::parse_quo(expr, env = rlang::global_env()))
# # A tibble: 2 x 3
# a b `d = a + b`
# <dbl> <dbl> <dbl>
# 1 1 3 4
# 2 2 4 6
data %>%
dplyr::mutate(rlang::eval_tidy(rlang::parse_expr(expr)))
# # A tibble: 2 x 3
# a b `rlang::eval_tidy(rlang::parse_expr(expr))`
# <dbl> <dbl> <dbl>
# 1 1 3 4
# 2 2 4 6
Run Code Online (Sandbox Code Playgroud)
如何正确使用 dplyr::mutate 中的表达式?
我的问题与此类似,但在我的示例中,新变量 ( d) 及其定义 ( a + b) 在单个字符向量 () 中给出expr。
这些都有效。第二个与第一个类似,但不要求rlang位于搜索路径上。d=如果该部分不存在,则第三个和第四个也可以使用,expr在这种情况下使用默认名称。最后一种仅使用基数 R,也是最短的。
data %>% mutate(within(., !!parse_expr(expr)))
data %>% mutate(within(., !!parse(text = expr)))
data %>% mutate(data, !!parse_expr(sprintf("tibble(%s)", expr)))
data %>% { eval_tidy(parse_expr(sprintf("mutate(., %s)", expr))) }
within(data, eval(parse(text = expr))) # base R
Run Code Online (Sandbox Code Playgroud)
假设这个前提:
library(dplyr)
library(rlang)
# input
data <- tibble(a = c(1, 2), b = c(3, 4))
expr <- "d = a + b"
Run Code Online (Sandbox Code Playgroud)