簡體   English   中英

使用mutate進行dplyr編程

[英]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_vara相同。

顯然,以下不起作用:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM