#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 ...