【问题标题】:Passing a parameter value to a simple function in R将参数值传递给R中的简单函数
【发布时间】:2020-06-20 23:20:41
【问题描述】:

我对 R 比较陌生,并且正在努力理解为什么下面的代码不起作用。

我正在使用 nycflights13 库中的航班数据集。我希望能够编写一个函数来计算我在函数参数中指定的变量的平均值。例如,下面的代码可以正常工作:

summarise(group_by(flights, year, month), 
          avg = mean(dep_delay, na.rm = TRUE))

但是,当我尝试将其放入函数中并计算 arr_delay 的平均值时,出现错误:

summarise_func <- function(var = dep_delay) {
  summarise(group_by(flights, year, month), 
            avg = mean(var, na.rm = TRUE))
}
summarise_func(var = arr_delay)

均值错误(var, na.rm = TRUE):找不到对象“arr_delay”

谁能解释一下为什么var参数(arr_delay)的值没有传递给函数以及如何解决这个问题?

我完全知道我可以编写另一段代码来计算平均 arr_delay,但我正试图弄清楚 R 是如何工作的。

谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    当您将事物放入函数时,它开始变得有点复杂。阅读有关非标准评估 (NSE) 的信息。

    现在,您可以使用 curly-curly ({{}}) 运算符在函数中传递不带引号的列名。

    library(dplyr)
    library(rlang)
    library(nycflights13)
    
    summarise_func <- function(flights, var = dep_delay) {
        flights %>%
          group_by(year, month) %>%
          summarise(avg = mean({{var}}, na.rm = TRUE))
    }
    
    summarise_func(flights, arr_delay)
    
    #    year month    avg
    #   <int> <int>  <dbl>
    # 1  2013     1  6.13 
    # 2  2013     2  5.61 
    # 3  2013     3  5.81 
    # 4  2013     4 11.2  
    # 5  2013     5  3.52 
    # 6  2013     6 16.5  
    # 7  2013     7 16.7  
    # 8  2013     8  6.04 
    # 9  2013     9 -4.02 
    #10  2013    10 -0.167
    #11  2013    11  0.461
    #12  2013    12 14.9  
    

    尝试默认选项

    summarise_func(flights)
    
    #    year month   avg
    #   <int> <int> <dbl>
    # 1  2013     1 10.0 
    # 2  2013     2 10.8 
    # 3  2013     3 13.2 
    # 4  2013     4 13.9 
    # 5  2013     5 13.0 
    # 6  2013     6 20.8 
    # 7  2013     7 21.7 
    # 8  2013     8 12.6 
    # 9  2013     9  6.72
    #10  2013    10  6.24
    #11  2013    11  5.44
    #12  2013    12 16.6 
    

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2019-03-29
      • 2019-03-17
      • 1970-01-01
      • 2015-01-31
      相关资源
      最近更新 更多