feat: further improved new factor interface

This commit is contained in:
Andreas Gammelgaard Damsbo 2025-10-31 11:36:54 +01:00
parent a1cc2d8955
commit 5a632e60fa
No known key found for this signature in database
2 changed files with 69 additions and 35 deletions

View file

@ -35,14 +35,7 @@ cut_variable_ui <- function(id) {
), ),
column( column(
width = 3, width = 3,
numericInput( shiny::uiOutput(ns("n_breaks"))
inputId = ns("n_breaks"),
label = i18n$t("Number of breaks:"),
value = 3,
min = 2,
max = 12,
width = "100%"
)
), ),
column( column(
width = 3, width = 3,
@ -123,8 +116,38 @@ cut_variable_server <- function(id, data_r = reactive(NULL)) {
# ) # )
}), data_r(), input$hidden) }), data_r(), input$hidden)
output$n_breaks <- shiny::renderUI({
req(input$method)
# req(!is.null(get_list_elements(name = input$cut_method,element = "breaks")))
# browser()
break_text <- get_list_elements(name = input$method, element = "breaks")
if (is.null(get_list_elements(name = input$method, element = "min"))) {
min <- 2
} else {
min <- get_list_elements(name = input$method, element = "min")
}
if (is.null(get_list_elements(name = input$method, element = "max"))) {
max <- 10
} else {
max <- get_list_elements(name = input$method, element = "max")
}
numericInput(
inputId = ns("n_breaks"),
label = break_text,
value = 3,
min = min,
max = max,
width = "100%"
)
})
output$slider_fixed <- renderUI({ output$slider_fixed <- renderUI({
data <- req(data_r()) data <- req(data_r())
req(input$n_breaks)
variable <- req(input$variable) variable <- req(input$variable)
req(hasName(data, variable)) req(hasName(data, variable))
@ -221,14 +244,6 @@ cut_variable_server <- function(id, data_r = reactive(NULL)) {
selected = NULL, selected = NULL,
width = "100%" width = "100%"
) )
# shinyWidgets::virtualSelectInput(
# inputId = session$ns("method"),
# label = i18n$t("Method:"),
# choices = choices,
# selected = NULL,
# width = "100%"
# )
}) })
@ -389,7 +404,7 @@ cut_variable_server <- function(id, data_r = reactive(NULL)) {
), ),
responseName = "count" responseName = "count"
) )
count_data$freq <- paste(signif(count_data$count/nrow(data)*100,3),"%") count_data$freq <- paste(signif(count_data$count / nrow(data) * 100, 3), "%")
# browser() # browser()
gridTheme <- getOption("datagrid.theme") gridTheme <- getOption("datagrid.theme")
if (length(gridTheme) < 1) { if (length(gridTheme) < 1) {
@ -398,7 +413,7 @@ cut_variable_server <- function(id, data_r = reactive(NULL)) {
on.exit(toastui::reset_grid_theme()) on.exit(toastui::reset_grid_theme())
grid <- toastui::datagrid( grid <- toastui::datagrid(
data = count_data, data = count_data,
colwidths = "guess", colwidths = "fit",
theme = "default", theme = "default",
bodyHeight = "auto" bodyHeight = "auto"
) )
@ -486,55 +501,63 @@ cut_methods <- function() {
"hour" = list( "hour" = list(
descr = i18n$t("Hour of the day"), descr = i18n$t("Hour of the day"),
# class = c("hms", "POSIXct"), # Not implemented yet, but will during rewrite at some point... # class = c("hms", "POSIXct"), # Not implemented yet, but will during rewrite at some point...
breaks = i18n$t("Breaks") breaks = NULL
), ),
"day" = list( "day" = list(
descr = i18n$t("By day of the week"), descr = i18n$t("By day of the week"),
breaks = i18n$t("Breaks") breaks = NULL
), ),
"weekday" = list( "weekday" = list(
descr = i18n$t("By weekday"), descr = i18n$t("By weekday"),
breaks = i18n$t("Breaks") breaks = NULL
), ),
"week" = list( "week" = list(
descr = i18n$t("By week number and year"), descr = i18n$t("By week number and year"),
breaks = i18n$t("Breaks") breaks = NULL
), ),
"week_only" = list( "week_only" = list(
descr = i18n$t("By week number"), descr = i18n$t("By week number"),
breaks = i18n$t("Breaks") breaks = NULL
), ),
"month" = list( "month" = list(
descr = i18n$t("By month and year"), descr = i18n$t("By month and year"),
breaks = i18n$t("Breaks") breaks = NULL
), ),
"month_only" = list( "month_only" = list(
descr = i18n$t("By month only"), descr = i18n$t("By month only"),
breaks = i18n$t("Breaks") breaks = NULL
), ),
"quarter" = list( "quarter" = list(
descr = i18n$t("By quarter of the year"), descr = i18n$t("By quarter of the year"),
breaks = i18n$t("Breaks") breaks = NULL
), ),
"year" = list( "year" = list(
descr = i18n$t("By year"), descr = i18n$t("By year"),
breaks = i18n$t("Breaks") breaks = NULL
), ),
"top" = list( "top" = list(
descr = i18n$t("Keep only most common"), descr = i18n$t("Keep only most common"),
breaks = i18n$t("Number") breaks = i18n$t("Number"),
min = 1,
max = 20
), ),
"bottom" = list( "bottom" = list(
descr = i18n$t("Combine below percentage"), descr = i18n$t("Combine below percentage"),
breaks = i18n$t("Percentage") breaks = i18n$t("Percentage"),
min = 1,
max = 50
), ),
"fixed" = list( "fixed" = list(
descr = i18n$t("By specified numbers"), descr = i18n$t("By specified numbers"),
breaks = i18n$t("Breaks") breaks = i18n$t("Breaks"),
min = 2,
max = 12
), ),
"quantile" = list( "quantile" = list(
descr = i18n$t("By quantiles (groups of equal size)"), descr = i18n$t("By quantiles (groups of equal size)"),
breaks = i18n$t("Breaks") breaks = i18n$t("Breaks"),
min = 2,
max = 10
) )
) )
} }
@ -555,9 +578,13 @@ cut_methods <- function() {
#' @examples #' @examples
#' get_list_elements(c("top", "bottom"), "descr") #' get_list_elements(c("top", "bottom"), "descr")
get_list_elements <- function(name, element, dict = cut_methods()) { get_list_elements <- function(name, element, dict = cut_methods()) {
sapply(dict[name], \(.x){ if (is.null(name)) {
.x[[element]] return(NULL)
}) } else {
sapply(dict[name], \(.x){
.x[[element]]
})
}
} }
#' Set values as names and names as values #' Set values as names and names as values

View file

@ -184,9 +184,16 @@ cut_var.factor <- function(x, breaks = NULL, type = c("top", "bottom"), other =
tbl <- sort(table(x), decreasing = TRUE) tbl <- sort(table(x), decreasing = TRUE)
if (type == "top") { if (type == "top") {
if (length(levels(x)) <= breaks){
return(x)
}
lvls <- names(tbl[seq_len(breaks)]) lvls <- names(tbl[seq_len(breaks)])
} else if (type == "bottom") { } else if (type == "bottom") {
lvls <- names(tbl)[!tbl / NROW(x) * 100 < breaks] freqs_check <- tbl / NROW(x) * 100 < breaks
if (!any(freqs_check)){
return(x)
}
lvls <- names(tbl)[!freqs_check]
} }
if (other %in% lvls) { if (other %in% lvls) {