#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