首页 > 解决方案 > 为什么 mutate 会在函数变量上窒息?

问题描述

这工作正常:

top_two <- c("Alderaan", "Chandrila")

starwars %>%
  drop_na(homeworld) %>%
  filter(gender == "feminine") %>%
  mutate(homeworld = ifelse(homeworld %in% top_two,
                            paste(top_two, collapse = " or "),
                            homeworld)) %>%
  count(homeworld) %>%
  mutate(percent = scales::percent(n/sum(n)))

但是当我尝试将其转换为函数时,它会因“变异”而窒息

census <- function(my_var, top_two){

starwars %>%
    drop_na({{my_var}}) %>%
    filter(gender == "feminine") %>%
    mutate({{my_var}} = ifelse({{my_var}} %in% top_two,
                              paste(top_two,collapse = " or "),
                              {{my_var}})) %>%
    count({{my_var}}) %>%
    mutate(percent = scales::percent(n/sum(n)))
}
top_two <- c("Alderaan", "Chandrila")

census(homeworld, top_two)

错误是

错误:意外的“=”在:“过滤器(性别==“女性”)%>%变异({{my_var}}=“

如果我my_var从字面上表示它工作正常:

census <- function(my_var, top_two){
  starwars %>%
      filter(gender == "feminine") %>%
      drop_na({{my_var}}) %>%
      mutate(homeworld = ifelse({{my_var}} %in% top_two,
                                paste(top_two, collapse = " or "),
                                {{my_var}})) %>%
      count({{my_var}}) %>%
      mutate(percent = scales::percent(n/sum(n)))
}

标签: rdplyr

解决方案


要使用非标准评估添加新列,您必须使用:=. 此外,最好将数据帧作为参数传递给函数。

library(dplyr)
library(rlang)

census <- function(data, my_var, top_two){
  
  data %>%
    drop_na({{my_var}}) %>%
    filter(gender == "feminine") %>%
    mutate({{my_var}} := ifelse({{my_var}} %in% top_two,
                               paste(top_two,collapse = " or "),
                               {{my_var}})) %>%
    count({{my_var}}) %>%
    mutate(percent = scales::percent(n/sum(n)))
}

top_two <- c("Alderaan", "Chandrila")
census(starwars, homeworld, top_two)

# A tibble: 9 x 3
#  homeworld                 n percent
#  <chr>                 <int> <chr>  
#1 Alderaan or Chandrila     2 13%    
#2 Coruscant                 2 13%    
#3 Kamino                    1 7%     
#4 Mirial                    2 13%    
#5 Naboo                     3 20%    
#6 Ryloth                    1 7%     
#7 Shili                     1 7%     
#8 Tatooine                  2 13%    
#9 Zolan                     1 7%     

推荐阅读