[英]dplyr programming using mutate
我正在努力用dplyr和mutate進行編程。
下面是一個可重復的例子。
library(tidyverse)
test <- tibble(a=1:10, b=1:10)
mute_function <- function(var, table) {
quo_var <- enquo(var)
sub_tb <-
table %>%
dplyr::select(!!quo_var, b) %>%
mutate(new_var=!!quo_var)
return(sub_tb)
}
應用此功能時
mute_function(var = "a", table = test)
我明白了:
# A tibble: 10 x 3
a b new_var
<int> <int> <chr>
1 1 1 a
2 2 2 a
3 3 3 a
4 4 4 a
5 5 5 a
6 6 6 a
7 7 7 a
8 8 8 a
9 9 9 a
10 10 10 a
我想得到一個新變量,它結合了a
和其他變量的值。 在上面的例子中,我期待new_var
與a
相同。
顯然,以下不起作用:
mute_function <- function(var, table) {
quo_var <- enquo(var)
sub_tb <-
table %>%
dplyr::select(!!quo_var, b) %>%
mutate(new_var=!!quo_var/b)
return(sub_tb)
}
mute_function(var = "a", table = test)
我不明白為什么我一直在仔細閱讀dplyr插圖進行編程。
在此先感謝您的幫助
如果我們傳遞一個字符串,使用sym
轉換為symbol
而不是quosure
mute_function <- function(var, table) {
quo_var <- rlang::sym(var)
sub_tb <-
table %>%
dplyr::select(!!quo_var, b) %>%
mutate(new_var=!!quo_var/b)
return(sub_tb)
}
out <- mute_function(var = "a", table = test)
out
# A tibble: 10 x 3
# a b new_var
# <int> <int> <dbl>
# 1 1 1 1
# 2 2 2 1
# 3 3 3 1
# 4 4 4 1
# 5 5 5 1
# 6 6 6 1
# 7 7 7 1
# 8 8 8 1
# 9 9 9 1
#10 10 10 1
但是,如果目標是傳遞參數,不加引號,OP的功能應該正常工作
mute_function(var = a, table = test)
但是,我們可以傳入帶引號和未帶引號的字符串
mute_function <- function(var, table) {
quo_var <- rlang::parse_expr(quo_name(enquo(var)))
sub_tb <-
table %>%
dplyr::select(!!quo_var, b) %>%
mutate(new_var=!!quo_var/b)
return(sub_tb)
}
out1 <- mute_function(var = "a", table = test)
out2 <- mute_function(var = a, table = test)
identical(out1, out2)
#[1] TRUE
identical(out, out1)
#[1] TRUE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.