В некоторой степени связано с аккуратным оценочным программированием с помощью dplyr :: case_when и Создание функции tidyeval внутри case_when , я хочу создавать строки (используя блестящее приложение) для последующего анализа внутри case_when
функция. Вот пример:
library(tidyverse)
# simulated shiny inputs
new_column = sym("COL_NAME")
number_of_categories = 3
col1_text = "Big"
col1_min = 7.0
col1_max = 8.0
col2_text = "Medium"
col2_min = 5.0
col2_max = 6.9
col3_text = "Small"
col3_max = 4.9
col3_min = 4.0
columninput = sym("Sepal.Length")
ЖЕЛАТЕЛЬНЫЙ ВЫХОД
iris %>%
mutate(new_column =
case_when(
!!columninput >= col1_min & !!columninput <= col1_max ~ col1_text,
!!columninput >= col2_min & !!columninput <= col2_max ~ col2_text,
!!columninput >= col3_min & !!columninput <= col3_max ~ col3_text
)
)
Поскольку единственное, что меняется между функциями, - это индекс, я подумал, что мы можем использовать общий шаблон для создания строки
# create single string
my_string <-function(i) {
paste0("!!", columninput, " >= col", i, "_min & ", "!!", columninput, " <= col", i, "_max ~ col", i, "_text")
}
Затем повторите строку для динамики c количество случаев
mega_string <- map_chr(1:number_of_categories, ~ my_string(.x))
TODO:
Это часть, которую я не могу собрать вместе: использование этих строк в качестве аргументов в case_when
.
# evaluate somehow?
iris %>%
mutate(
new_column = case_when(
# tidyeval mega_string?
paste(mega_string, collapse = "," )
)
)
Это вообще правильный подход? go Как еще вы могли бы *1026* решить эту проблему - любая помощь высокого уровня или иначе приветствуется!