在函数内部传递参数时,Dplyr“编排”函数不起作用

时间:2019-09-25 20:58:31

标签: r dplyr

我一直在寻找有关将参数传递给自定义函数中的dplyr函数的帖子,但我无法解决以下情况:

我创建了以下函数来获取数据帧的子集。

library(Lahman)

top_leaders <- function(df, metric, n) {
     # metric is the name of the column of Batting df which I would like to analyze
     # n is the number of top players leaders on that metric

    stat_leader <- enquo(metric)

    df %>%
      dplyr::select(playerID, !!stat_leader) %>% 
      dplyr::top_n(n)
  }

由于该功能很好用,因此可以将n个玩家领导者替换为该属性。例如:

> top_leaders(Lahman::Batting, "R", 5)
Selecting by R
   playerID   R
1 oneilti01 167
2 brownto01 177
3 hamilbi01 198
4  ruthba01 177
5 gehrilo01 167

尽管如此,我还是希望对结果进行排序,所以我使用了arrange函数来根据统计信息对结果进行排序。

top_leaders <- function(df, metric, n) {
    stat_leader <- enquo(metric)

    df %>%
      dplyr::select(playerID, !!stat_leader) %>% 
      dplyr::top_n(n) %>%
      dplyr::arrange(desc(!!stat_leader))
  }

但是会出现以下错误:

Selecting by R
 Error: incorrect size (1) at position 1, expecting : 5 

我稍后尝试使用arrange_(desc(!!stat_leader))并得到另一个错误:

Selecting by R
 Error: Quosures can only be unquoted within a quasiquotation context.

  # Bad:
  list(!!myquosure)

  # Good:
  dplyr::mutate(data, !!myquosure)

所以我对如何解决这个问题没有想法。

2 个答案:

答案 0 :(得分:2)

利用Rlang's new curly-curly notation

top_leaders <- function(df, playerID, metric, n) {
  df %>%
    dplyr::select({{playerID}}, {{metric}}) %>% 
    dplyr::top_n(n) %>%
    dplyr::arrange(desc({{metric}})) %>% 
    return(.)
}

top_leaders(as_tibble(Lahman::Batting), playerID, R, 5)

#Selecting by R
## A tibble: 5 x 2
#  playerID      R
#  <chr>     <int>
#1 hamilbi01   198
#2 brownto01   177
#3 ruthba01    177
#4 oneilti01   167
#5 gehrilo01   167

您也需要将playerID传递给该函数,但这只是一个很小的改动。

答案 1 :(得分:1)

我们在传递字符串时可能需要在此处转换为SaveConfigFinalSemana: function($event) { console.log($event.srcEvent.target); console.log($event.srcEvent.target.name); } bol。

sym

如果我们传递未加引号的变量名,它也将起作用

top_leaders <- function(df, metric, n) {
    stat_leader <- ensym(metric)

     df %>%
       dplyr::select(playerID, !!stat_leader) %>% 
       dplyr::top_n(n) %>%
       dplyr::arrange(desc(!!stat_leader))
     }
top_leaders(Lahman::Batting, "R", 5)
#Selecting by R
#   playerID   R
#1 hamilbi01 198
#2 brownto01 177
#3  ruthba01 177
#4 oneilti01 167
#5 gehrilo01 167

使用OP的功能,它只希望使用不带引号的参数而不是带引号的