Функция R для вычисления среднего, sd или медианы, но сравнение, похоже, не работает, есть ли лучший способ сделать это?

#r #function

#r #функция

Вопрос:

Как мне оценить x в операторах if else, если они являются функциями?

    library(dplyr)
    stat_mtcars <- function(x) {
      if (x == mean) {
        wht_stat <-  "Mean"
      } else if(x == sd) {
        wht_stat <- "sd"
      } else if(x == median) {
        wht_stat <- "Median" 
      }
      output <- mtcars %>% 
        summarise(wht_stat = x(mpg))
      output
    }
    
    stat_mtcars(mean)
  

Ответ №1:

Вам не нужно делать ничего особенного, вы можете напрямую передавать имена функций и применять их.

 library(dplyr)
library(rlang)

stat_mtcars <- function(x) {
  fun <- deparse(substitute(x))
  mtcars %>% 
    summarise(!!paste0(fun, '_stat') := x(mpg))
}

stat_mtcars(mean)
#  mean_stat
#1  20.09062

#Check output
mtcars %>% 
  summarise(wht_stat = mean(mpg))
#  wht_stat
#1 20.09062

stat_mtcars(sd)
#   sd_stat
#1 6.026948
  

Комментарии:

1. Я хотел бы, чтобы wht_stat указал, какую меру я использовал.

2. это работает, спасибо, но не могли бы вы объяснить, что делает !!paste0? Я имею в виду!! впереди и := что означает двоеточие?

3. Для оценки переменной с левой стороны мы используем !! with := . На самом деле это очень широкая тема, попробуйте поискать нестандартную оценку, чтобы узнать больше.

Ответ №2:

Мы можем использовать rlang , чтобы помочь:

 library(dplyr)
library(rlang)
stat_mtcars <- function(x) {
  output <- mtcars %>% 
    summarise({{x}} := x(mpg))
  output
}

stat_mtcars(mean)

##      mean
## 1 20.09062
  

И что касается вопроса, мы можем deparse(substitute(x)) использовать то, что было предоставлено функции.

 is_mean = function(x) {
  x_sub = substitute(x)
  deparse(x_sub) == 'mean'
}
is_mean(mean)
#> [1] TRUE
is_mean(meany)
#> [1] FALSE