Условное изменение в пользовательской функции для изменения символьного столбца в R

#r #function #if-statement #dplyr #tidyverse

#r #функция #if-оператор #dplyr #tidyverse

Вопрос:

Предположим, у меня есть следующая функция в R:

 my_function <- function(date1, date2, variable, quota, monthly_business_days) {
    my_data %>%
        filter(between(DATE, ymd(date1), ymd(date2))) %>% 
        summarize(total = sum({{variable}})) %>%
        add_row(total = quota, .before = 1) %>% 
        rbind(.$total[[2]]/bizdays(date1, date2)*monthly_business_days)
    if(variable == UNITS) { 
        %>% mutate(indicator = c("Quota (Units)", "Sales (Units)", "Forecast (Units)"))
    } else {
        %>% mutate(indicator = c("Quota (USD)", "Sales (USD)", "Forecast (USD)"))
    }
}
 

В зависимости от ввода в «переменную», которые ссылаются на столбцы в фрейме данных «my_data», я хотел бы действовать по-разному (см. Фрагмент if / else). Однако это невозможно сделать с помощью dplyr (единственным вариантом было бы записать все отдельно, но я не могу позволить себе написать столько строк кода). В настоящее время я работаю в блестящем приложении, пытаясь сократить строки кода с использованием функционального программирования.

Различные сообщения здесь, в StackOverflow, пока не дали мне ответа.

Я был бы очень признателен за любую помощь. Спасибо!

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

1. Как вы вызываете my_function ?

Ответ №1:

Попробуйте использовать приведенную ниже функцию :

 library(dplyr)

my_function <- function(date1, date2, variable, quota, monthly_business_days) {
  value <- deparse(substitute(variable))
  
  my_data %>%
    filter(between(DATE, ymd(date1), ymd(date2))) %>% 
    summarize(total = sum({{variable}})) %>%
    add_row(total = quota, .before = 1) %>% 
    rbind(.$total[[2]]/bizdays(date1, date2)*monthly_business_days) %>%
    mutate(indicator = if(value == 'UNITS') c("Quota (Units)", "Sales (Units)", "Forecast (Units)")
                       else c("Quota (USD)", "Sales (USD)", "Forecast (USD)"))
           
}
 

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

1. Отлично, это работает! Однако можем ли мы также включить else if?

2. Да, вы можете продолжить аналогичным образом, включая else if(some_condition) c("Quota (USD)", "Sales (USD)", "Forecast (USD)") else ...