From 31aa48bc2072848bb1fd36e5a4d8ad50d81ef2b9 Mon Sep 17 00:00:00 2001 From: damiancodes Date: Fri, 3 Jul 2026 00:29:21 +0300 Subject: [PATCH 01/11] Add async caret job queue with concurrent model training - Add all caret job queue label keys --- server.R | 18 +- server/caret_job_manager.R | 719 ++++++++++++++++++++++++++ server/caret_job_worker.R | 209 ++++++++ server/compare_trained_caret_models.R | 36 +- server/model_training_setup.R | 3 + server/setup_models.R | 31 +- server/train_caret_models.R | 424 +++------------ static_files/labelling_file.xlsx | Bin 2164022 -> 2277062 bytes ui/train_all_model_ui.R | 280 +++------- 9 files changed, 1137 insertions(+), 583 deletions(-) create mode 100644 server/caret_job_manager.R create mode 100644 server/caret_job_worker.R diff --git a/server.R b/server.R index 7833ecd..1587dab 100644 --- a/server.R +++ b/server.R @@ -20,7 +20,7 @@ function(input, output, session){ register_homepage_labels(output, session, get_rv_labels) USER = user_auth(input, output, session) - + authed_started = reactiveVal(FALSE) observeEvent(USER$logged_in, { @@ -30,7 +30,10 @@ function(input, output, session){ color = "#FFF" ) - if (authed_started()) return() + if (authed_started()) { + waiter::waiter_hide() + return() + } authed_started(TRUE) app_username = USER$username @@ -925,6 +928,17 @@ function(input, output, session){ update_progress("Ready!") waiter::waiter_hide() + + ## After the waiter hides, force the active sidebar tab to re-trigger. + ## This un-suspends outputs inside the active tab (home page, etc.) + ## that may have been suspended during the waiter overlay — fixes the + ## blank content area seen after cookie-based auto-login. + shinyjs::runjs(" + setTimeout(function() { + var active = $('ul.sidebar-menu li.active > a').first(); + if (active.length) { active.trigger('click'); } + }, 400); + ") }, ignoreInit = FALSE) waiter::waiter_hide() diff --git a/server/caret_job_manager.R b/server/caret_job_manager.R new file mode 100644 index 0000000..725c903 --- /dev/null +++ b/server/caret_job_manager.R @@ -0,0 +1,719 @@ +source("server/caret_job_worker.R", local = TRUE) + +caret_job_manager_server <- function( + input, + output, + session, + rv_current, + rv_ml_ai, + rv_training_models, + rv_train_control_caret, + rv_training_results, + app_username, + get_rv_labels +) { + job_processes <- new.env(parent = emptyenv()) + job_configs <- new.env(parent = emptyenv()) + job_results <- new.env(parent = emptyenv()) + job_table <- reactiveVal(data.frame()) + context_cache <- reactiveVal(NULL) + context_version <- reactiveVal(0L) + context_cache_token <- digest::digest(paste(Sys.time(), runif(1)), algo = "xxhash64") + + label <- function(key, fallback) { + value <- tryCatch(as.character(get_rv_labels(key)), error = function(e) NULL) + if (is.null(value) || length(value) == 0 || is.na(value[[1]]) || !nzchar(value[[1]])) { + return(fallback) + } + value[[1]] + } + + empty_jobs <- function() { + data.frame( + job_id = character(), + model_id = character(), + model_label = character(), + status = character(), + step = character(), + started_at = as.POSIXct(character()), + finished_at = as.POSIXct(character()), + error = character(), + result_path = character(), + config_path = character(), + stringsAsFactors = FALSE + ) + } + + get_jobs <- function() { + jobs <- job_table() + if (is.null(jobs) || !NROW(jobs)) empty_jobs() else jobs + } + + set_jobs <- function(jobs) { + job_table(jobs) + } + + has_active_run <- function(jobs = get_jobs()) { + NROW(jobs) && any(jobs$status %in% c("queued", "running", "paused"), na.rm = TRUE) + } + + sync_training_state <- function(jobs = get_jobs()) { + rv_training_results$training_busy <- has_active_run(jobs) + rv_training_results$training_completed <- NROW(jobs) && any(jobs$status == "completed", na.rm = TRUE) + } + + clear_model_selection <- function(model_ids) { + for (id in model_ids) { + updatePrettyCheckbox( + session, + inputId = paste0("model_training_caret_models_", id, "_check"), + value = FALSE + ) + } + rv_ml_ai$at_least_one_model <- FALSE + invisible(NULL) + } + + clear_completed_model_results <- function(model_ids) { + result_names <- ls(job_results) + if (!length(result_names) || !length(model_ids)) return(invisible(NULL)) + for (result_name in result_names) { + result <- get(result_name, envir = job_results, inherits = FALSE) + if (!is.null(result$model_id) && result$model_id %in% model_ids) { + rm(list = result_name, envir = job_results) + } + } + invisible(NULL) + } + + update_job <- function(job_id, ...) { + jobs <- get_jobs() + idx <- which(jobs$job_id == job_id) + if (!length(idx)) return(invisible(FALSE)) + values <- list(...) + for (nm in names(values)) { + jobs[[nm]][idx] <- values[[nm]] + } + set_jobs(jobs) + sync_training_state(jobs) + invisible(TRUE) + } + + js_value <- function(x) { + x <- gsub("\\\\", "\\\\\\\\", x) + x <- gsub("'", "\\\\'", x) + x + } + + status_label <- function(status) { + switch( + status, + queued = label("caret_jobs_status_queued", "Queued"), + running = label("caret_jobs_status_running", "Running"), + paused = label("caret_jobs_status_paused", "Paused"), + stopped = label("caret_jobs_status_stopped", "Stopped"), + completed = label("caret_jobs_status_completed", "Completed"), + failed = label("caret_jobs_status_failed", "Failed"), + status + ) + } + + step_label <- function(step) { + switch( + step, + queued = label("caret_jobs_step_queued", "Queued"), + training = label("caret_jobs_step_training", "Training"), + evaluating = label("caret_jobs_step_evaluating", "Checking performance"), + saving = label("caret_jobs_step_saving", "Saving results"), + ready = label("caret_jobs_step_ready", "Ready"), + failed = label("caret_jobs_status_failed", "Failed"), + paused = label("caret_jobs_status_paused", "Paused"), + stopped = label("caret_jobs_status_stopped", "Stopped"), + step + ) + } + + job_status_label <- function(job) { + status <- job$status[[1]] + step <- job$step[[1]] + if (identical(status, "running") && !is.na(step) && nzchar(step)) return(step_label(step)) + if (identical(status, "completed")) return(step_label("ready")) + status_label(status) + } + + status_color <- function(status) { + switch( + status, + queued = "#9aa3a8", + running = "#2196f3", + paused = "#f6a100", + stopped = "#777777", + completed = "#4cae4c", + failed = "#d9534f", + "#9aa3a8" + ) + } + + active_step <- function(job) { + status <- job$status[[1]] + step <- if (!is.null(job$step[[1]]) && !is.na(job$step[[1]]) && nzchar(job$step[[1]])) { + job$step[[1]] + } else { + status + } + switch( + status, + queued = "queued", + running = step, + paused = step, + stopped = step, + completed = "ready", + failed = step, + step + ) + } + + step_rank <- function(step) { + steps <- c("queued", "training", "evaluating", "saving", "ready") + idx <- match(step, steps) + if (is.na(idx)) 1L else idx + } + + stepper_icon <- function(status, current, done) { + if (identical(status, "failed") && current) return("fa fa-exclamation-triangle") + if (identical(status, "stopped") && current) return("fa fa-stop") + if (identical(status, "paused") && current) return("fa fa-pause") + if (identical(status, "running") && current) return("fa fa-spinner fa-spin") + if (done || identical(status, "completed")) return("fa fa-check") + if (current) return("fa fa-clock-o") + "fa fa-circle-o" + } + + job_stepper <- function(job) { + status <- job$status[[1]] + steps <- c("queued", "training", "evaluating", "saving", "ready") + current_step <- active_step(job) + current_rank <- step_rank(current_step) + + tags$div( + class = "cmp-steps", + lapply(seq_along(steps), function(i) { + step <- steps[[i]] + current <- identical(step, current_step) + done <- i < current_rank || identical(status, "completed") + step_class <- paste( + "cmp-step", + if (done) "is-done" else "", + if (current) "is-current" else "", + if (current && status %in% c("paused", "stopped", "failed")) paste0("is-", status) else "" + ) + tags$div( + class = step_class, + tags$span(class = "cmp-step-icon", tags$i(class = stepper_icon(status, current, done))), + tags$span(class = "cmp-step-label", step_label(step)) + ) + }) + ) + } + + action_button <- function(job_id, action, text, class = "btn btn-xs btn-default") { + tags$button( + type = "button", + class = class, + onclick = sprintf( + "Shiny.setInputValue('caret_job_action', {job_id: '%s', action: '%s', nonce: Math.random()}, {priority: 'event'})", + js_value(job_id), + js_value(action) + ), + text + ) + } + + job_actions <- function(job) { + status <- job$status + job_id <- job$job_id + if (identical(status, "running")) { + tagList( + action_button(job_id, "pause", label("caret_jobs_pause", "Pause"), "btn btn-xs btn-warning"), + action_button(job_id, "stop", label("caret_jobs_stop", "Stop"), "btn btn-xs btn-danger") + ) + } else if (identical(status, "queued")) { + tagList( + action_button(job_id, "pause", label("caret_jobs_pause", "Pause"), "btn btn-xs btn-warning"), + action_button(job_id, "stop", label("caret_jobs_stop", "Stop"), "btn btn-xs btn-danger") + ) + } else if (identical(status, "paused")) { + tagList( + action_button(job_id, "resume", label("caret_jobs_resume", "Resume"), "btn btn-xs btn-success"), + action_button(job_id, "stop", label("caret_jobs_stop", "Stop"), "btn btn-xs btn-danger") + ) + } else if (identical(status, "failed")) { + tagList( + action_button(job_id, "resume", label("caret_jobs_retry", "Retry"), "btn btn-xs btn-primary"), + action_button(job_id, "clear", label("caret_jobs_clear", "Clear"), "btn btn-xs btn-default") + ) + } else if (identical(status, "stopped")) { + tagList( + action_button(job_id, "resume", label("caret_jobs_resume", "Resume"), "btn btn-xs btn-success"), + action_button(job_id, "clear", label("caret_jobs_clear", "Clear"), "btn btn-xs btn-default") + ) + } else if (identical(status, "completed")) { + action_button(job_id, "clear", label("caret_jobs_clear", "Clear"), "btn btn-xs btn-default") + } else { + action_button(job_id, "clear", label("caret_jobs_clear", "Clear"), "btn btn-xs btn-default") + } + } + + max_concurrent_jobs <- reactive({ + if (!isTRUE(input$model_training_setup_start_clusters_check)) return(1L) + env_cap <- suppressWarnings(as.integer(Sys.getenv("NOCODE_CARET_MAX_JOBS", unset = NA_character_))) + if (!is.na(env_cap) && env_cap >= 1L) return(env_cap) + detected <- tryCatch(parallel::detectCores(logical = FALSE), error = function(e) NA_integer_) + if (is.na(detected) || detected < 1L) return(2L) + max(1L, detected - 1L) + }) + + observeEvent(rv_ml_ai$preprocessed, { + context_version(context_version() + 1L) + context_cache(NULL) + }, ignoreInit = TRUE) + + # Pre-warm the context cache whenever preprocessing or the eval metric changes. + # Uses observeEvent so reactive reads inside the handler are automatically + # isolated — avoids "no active reactive context" errors from nested reads. + observeEvent( + list(rv_ml_ai$preprocessed, input$model_training_setup_eval_metric), + { + req(!is.null(rv_ml_ai$preprocessed)) + req(!is.null(input$model_training_setup_eval_metric)) + req(nzchar(input$model_training_setup_eval_metric)) + prewarm_dir <- file.path(app_username, ".caret_jobs", "_context_cache") + dir.create(prewarm_dir, recursive = TRUE, showWarnings = FALSE) + train_control <- reactiveValuesToList(rv_train_control_caret) + tryCatch( + get_training_context_path(prewarm_dir, train_control), + error = function(e) NULL + ) + }, + ignoreInit = TRUE, + ignoreNULL = FALSE + ) + + training_context_signature <- function(train_control) { + preprocessed <- rv_ml_ai$preprocessed + train_df <- preprocessed$train_df + test_df <- preprocessed$test_df + digest::digest( + list( + dataset_id = rv_ml_ai$dataset_id, + session_id = rv_ml_ai$session_id, + outcome = rv_ml_ai$outcome, + task = rv_ml_ai$task, + metric = input$model_training_setup_eval_metric, + seed = rv_ml_ai$seed_value, + model_formula = paste(deparse(rv_ml_ai$model_formula), collapse = ""), + train_dim = if (is.data.frame(train_df)) dim(train_df) else NULL, + test_dim = if (is.data.frame(test_df)) dim(test_df) else NULL, + train_names = if (is.data.frame(train_df)) names(train_df) else NULL, + test_names = if (is.data.frame(test_df)) names(test_df) else NULL, + context_cache_token = context_cache_token, + context_version = context_version(), + train_control = train_control + ), + algo = "xxhash64" + ) + } + + build_training_context <- function(train_control) { + list( + app_dir = getwd(), + app_username = app_username, + train_df = rv_ml_ai$preprocessed$train_df, + test_df = rv_ml_ai$preprocessed$test_df, + preprocessed = rv_ml_ai$preprocessed, + model_formula = rv_ml_ai$model_formula, + train_control = train_control, + metric = input$model_training_setup_eval_metric, + seed = rv_ml_ai$seed_value, + use_cluster = FALSE, + dataset_id = rv_ml_ai$dataset_id, + session_id = rv_ml_ai$session_id, + outcome = rv_ml_ai$outcome, + task = rv_ml_ai$task + ) + } + + get_training_context_path <- function(run_dir, train_control) { + signature <- training_context_signature(train_control) + cache <- context_cache() + if ( + !is.null(cache) && + identical(cache$signature, signature) && + !is.null(cache$path) && + file.exists(cache$path) + ) { + return(cache$path) + } + + cache_dir <- file.path(app_username, ".caret_jobs", "_context_cache") + dir.create(cache_dir, recursive = TRUE, showWarnings = FALSE) + context_path <- file.path(cache_dir, paste0(signature, ".rds")) + if (!file.exists(context_path)) { + saveRDS(build_training_context(train_control), context_path) + } + context_cache(list(signature = signature, path = context_path)) + context_path + } + + selected_model_jobs <- function(run_dir, skip_model_ids = character()) { + models_state <- reactiveValuesToList(rv_training_models) + model_ids <- rv_training_models$CARET_MODEL_IDS + Filter(Negate(is.null), lapply(model_ids, function(id) { + if (id %in% skip_model_ids) return(NULL) + if (!isTRUE(input[[paste0("model_training_caret_models_", id, "_check")]])) return(NULL) + model_spec <- models_state[[paste0(id, "_model")]] + if (is.null(model_spec)) return(NULL) + model_name <- models_state[[paste0(id, "_name")]] + model_label <- if (!is.null(names(model_name)) && nzchar(names(model_name)[1])) { + names(model_name)[1] + } else { + as.character(model_name[1]) + } + job_id <- paste0(id, "-", digest::digest(paste(id, Sys.time(), runif(1)), algo = "xxhash32")) + job_dir <- file.path(run_dir, job_id) + dir.create(job_dir, recursive = TRUE, showWarnings = FALSE) + list( + job_id = job_id, + model_id = id, + model_label = model_label, + model_list = model_spec, + job_dir = job_dir + ) + })) + } + + write_job_config <- function(job, context_path) { + config_path <- file.path(job$job_dir, "config.rds") + result_path <- file.path(job$job_dir, "result.rds") + status_path <- file.path(job$job_dir, "status.rds") + config <- list( + context_path = context_path, + model_id = job$model_id, + model_label = job$model_label, + model_list = job$model_list, + config_path = config_path, + result_path = result_path, + status_path = status_path + ) + saveRDS(config, config_path) + saveRDS(list(status = "queued", step = "queued", updated_at = Sys.time()), status_path) + assign(job$job_id, config, envir = job_configs) + config + } + + start_job <- function(job_id) { + if (!exists(job_id, envir = job_configs, inherits = FALSE)) return(FALSE) + config <- get(job_id, envir = job_configs) + proc <- callr::r_bg( + func = caret_job_worker, + args = list(config$config_path), + stdout = file.path(dirname(config$config_path), "stdout.log"), + stderr = file.path(dirname(config$config_path), "stderr.log"), + supervise = TRUE + ) + assign(job_id, proc, envir = job_processes) + update_job(job_id, status = "running", step = "training", started_at = Sys.time(), error = "") + TRUE + } + + start_queued_jobs <- function() { + jobs <- get_jobs() + if (!NROW(jobs)) return(invisible(NULL)) + running <- sum(jobs$status == "running", na.rm = TRUE) + available <- max(0L, max_concurrent_jobs() - running) + if (!available) return(invisible(NULL)) + to_start <- head(jobs$job_id[jobs$status == "queued"], available) + for (job_id in to_start) start_job(job_id) + sync_training_state() + invisible(NULL) + } + + merge_job_results <- function() { + results <- mget(ls(job_results), envir = job_results, inherits = FALSE) + results <- results[!vapply(results, is.null, logical(1))] + if (!length(results)) return(invisible(NULL)) + + models <- do.call(c, lapply(results, `[[`, "models")) + class(models) <- unique(c("caretList", class(models))) + rv_training_results$models <- models + + tuned <- do.call(c, lapply(results, `[[`, "tuned_parameters")) + rv_training_results$tuned_parameters <- tuned + + rv_training_results$control_parameters <- results[[1]]$control_parameters + + train_metrics <- do.call(rbind, lapply(results, `[[`, "train_metrics_df")) + class(train_metrics) <- unique(c("Rautomlmetric", class(train_metrics))) + rv_training_results$train_metrics_df <- train_metrics + + test_specifics <- do.call(rbind, lapply(results, function(x) x$test_metrics_objs$specifics)) + test_all <- do.call(rbind, lapply(results, function(x) x$test_metrics_objs$all)) + test_roc <- do.call(rbind, lapply(results, function(x) x$test_metrics_objs$roc_df)) + test_metrics <- list( + specifics = test_specifics, + all = test_all, + roc_df = test_roc, + positive_cat = results[[1]]$test_metrics_objs$positive_cat + ) + class(test_metrics) <- c("Rautomlmetric2", "list") + rv_training_results$test_metrics_objs <- test_metrics + + post_metrics <- do.call(c, lapply(results, `[[`, "post_model_metrics_objs")) + rv_training_results$post_model_metrics_objs <- post_metrics + invisible(NULL) + } + + poll_jobs <- function() { + jobs <- get_jobs() + if (!NROW(jobs)) return(invisible(NULL)) + + new_completion <- FALSE + + for (job_id in jobs$job_id[jobs$status == "running"]) { + proc <- if (exists(job_id, envir = job_processes, inherits = FALSE)) { + get(job_id, envir = job_processes) + } else { + NULL + } + config <- get(job_id, envir = job_configs) + if (!is.null(proc) && proc$is_alive()) { + status <- tryCatch(suppressWarnings(readRDS(config$status_path)), error = function(e) NULL) + result <- tryCatch(suppressWarnings(readRDS(config$result_path)), error = function(e) NULL) + if (!is.null(status) && identical(status$status, "failed")) { + msg <- if (!is.null(status$message)) status$message else label("caret_jobs_status_failed", "Failed") + if (!is.null(result$error)) msg <- result$error + update_job(job_id, status = "failed", step = "failed", finished_at = Sys.time(), error = msg) + next + } + if (!is.null(status) && identical(status$status, "completed") && !is.null(result) && is.null(result$error)) { + assign(job_id, result, envir = job_results) + update_job(job_id, status = "completed", step = "ready", finished_at = Sys.time(), error = "") + new_completion <- TRUE + next + } + current_step <- jobs$step[jobs$job_id == job_id][[1]] + status_step <- status$step + if (identical(status_step, "queued") && identical(current_step, "training")) { + next + } + if (!is.null(status_step) && !identical(status_step, current_step)) { + update_job(job_id, step = status_step) + } + next + } + if (is.null(proc)) next + + status <- tryCatch(suppressWarnings(readRDS(config$status_path)), error = function(e) NULL) + result <- tryCatch(suppressWarnings(readRDS(config$result_path)), error = function(e) NULL) + exit_status <- proc$get_exit_status() + + if (!is.null(status) && identical(status$status, "completed") && !is.null(result) && is.null(result$error)) { + assign(job_id, result, envir = job_results) + update_job(job_id, status = "completed", step = "ready", finished_at = Sys.time(), error = "") + new_completion <- TRUE + } else { + msg <- if (!is.null(status$message)) status$message else paste("Process exited with status", exit_status) + if (!is.null(result$error)) msg <- result$error + update_job(job_id, status = "failed", step = "failed", finished_at = Sys.time(), error = msg) + } + } + + if (new_completion) merge_job_results() + start_queued_jobs() + invisible(NULL) + } + + observeEvent(input$model_training_apply, { + req(!is.null(rv_current$working_df)) + req(!is.null(rv_ml_ai$preprocessed)) + req(isTRUE(rv_ml_ai$at_least_one_model)) + + if (isTRUE(input$model_training_setup_include_ensemble_check)) { + showNotification( + label("caret_jobs_ensemble_deferred", "The async queue will train the selected base models now. Ensemble training needs a dependent background job and is not included in this run."), + type = "warning", + duration = 8 + ) + } + + run_id <- format(Sys.time(), "%Y%m%d%H%M%S") + run_dir <- file.path(app_username, ".caret_jobs", run_id) + dir.create(run_dir, recursive = TRUE, showWarnings = FALSE) + dir.create(file.path(app_username, "models"), recursive = TRUE, showWarnings = FALSE) + dir.create(file.path(app_username, "recipes"), recursive = TRUE, showWarnings = FALSE) + dir.create(file.path(app_username, "outputs"), recursive = TRUE, showWarnings = FALSE) + dir.create(file.path(app_username, ".log_files"), recursive = TRUE, showWarnings = FALSE) + + train_control <- reactiveValuesToList(rv_train_control_caret) + + current_jobs <- get_jobs() + active_model_ids <- if (NROW(current_jobs)) { + current_jobs$model_id[current_jobs$status %in% c("queued", "running", "paused")] + } else { + character() + } + selected_input_ids <- rv_training_models$CARET_MODEL_IDS[vapply(rv_training_models$CARET_MODEL_IDS, function(id) { + isTRUE(input[[paste0("model_training_caret_models_", id, "_check")]]) + }, logical(1))] + jobs <- selected_model_jobs(run_dir, skip_model_ids = active_model_ids) + + if (!length(jobs)) { + showNotification( + label("caret_jobs_no_new_models", "The selected models are already in the training queue or results panel."), + type = "message" + ) + clear_model_selection(selected_input_ids) + return(invisible(NULL)) + } + + skipped_count <- sum(selected_input_ids %in% active_model_ids) + if (skipped_count > 0) { + showNotification( + label("caret_jobs_duplicate_skipped", "Some selected models were already in the queue and were not added again."), + type = "message" + ) + } + + rerun_model_ids <- vapply(jobs, `[[`, character(1), "model_id") + clear_completed_model_results(rerun_model_ids) + if (NROW(current_jobs)) { + current_jobs <- current_jobs[!( + current_jobs$status == "completed" & + current_jobs$model_id %in% rerun_model_ids + ), , drop = FALSE] + } + + context_path <- get_training_context_path(run_dir, train_control) + + job_rows <- lapply(jobs, function(job) { + config <- write_job_config(job, context_path) + data.frame( + job_id = job$job_id, + model_id = job$model_id, + model_label = job$model_label, + status = "queued", + step = "queued", + started_at = as.POSIXct(NA), + finished_at = as.POSIXct(NA), + error = "", + result_path = config$result_path, + config_path = config$config_path, + stringsAsFactors = FALSE + ) + }) + set_jobs(rbind(current_jobs, do.call(rbind, job_rows))) + sync_training_state() + clear_model_selection(selected_input_ids) + start_queued_jobs() + }, ignoreInit = TRUE) + + observeEvent(input$caret_job_action, { + action <- input$caret_job_action$action + job_id <- input$caret_job_action$job_id + jobs <- get_jobs() + if (!NROW(jobs)) return(invisible(NULL)) + + if (identical(action, "clear_completed")) { + jobs <- jobs[jobs$status != "completed", , drop = FALSE] + set_jobs(jobs) + sync_training_state(jobs) + return(invisible(NULL)) + } + + if (!(job_id %in% jobs$job_id)) return(invisible(NULL)) + + status <- jobs$status[jobs$job_id == job_id][[1]] + if (action == "pause") { + if (identical(status, "running") && exists(job_id, envir = job_processes, inherits = FALSE)) { + proc <- get(job_id, envir = job_processes) + if (proc$is_alive()) proc$kill() + } + update_job(job_id, status = "paused", finished_at = Sys.time()) + } else if (action == "stop") { + if (identical(status, "running") && exists(job_id, envir = job_processes, inherits = FALSE)) { + proc <- get(job_id, envir = job_processes) + if (proc$is_alive()) proc$kill() + } + update_job(job_id, status = "stopped", finished_at = Sys.time()) + } else if (action == "resume") { + update_job(job_id, status = "queued", step = "queued", started_at = as.POSIXct(NA), finished_at = as.POSIXct(NA), error = "") + } else if (action == "clear") { + jobs <- jobs[jobs$job_id != job_id, , drop = FALSE] + set_jobs(jobs) + sync_training_state(jobs) + } + + poll_jobs() + }, ignoreInit = TRUE) + + observe({ + jobs <- get_jobs() + if (NROW(jobs) && any(jobs$status %in% c("queued", "running"))) { + invalidateLater(2000, session) + poll_jobs() + } + }) + + output$caret_job_queue_panel <- renderUI({ + jobs <- get_jobs() + if (!NROW(jobs)) return(NULL) + + count <- function(status) sum(jobs$status == status, na.rm = TRUE) + rows <- lapply(seq_len(nrow(jobs)), function(i) { + job <- jobs[i, , drop = FALSE] + status <- job$status[[1]] + + tags$div( + class = "cmp-row", + tags$div(class = "cmp-num", paste0(i, ".")), + tags$div(class = "cmp-name", job$model_label), + tags$div( + class = "cmp-status", + tags$span(class = "cmp-sdot", style = paste0("background:", status_color(status), ";")), + tags$span(class = "cmp-slabel", job_status_label(job)) + ), + job_stepper(job), + tags$div(class = "cmp-action", job_actions(job)) + ) + }) + + tags$div( + id = "caret-model-progress", + class = "cmp-visible", + tags$div( + class = "cmp-header", + tags$div(class = "cmp-title", label("caret_jobs_progress_title", "Training queue")), + tags$div( + class = "cmp-counts", + tags$span(tags$span(class = "cmp-count-dot", style = "background:#2196f3;"), paste(count("running"), label("caret_jobs_count_running", "running"))), + tags$span("\u2022"), + tags$span(tags$span(class = "cmp-count-dot", style = "background:#9aa3a8;"), paste(count("queued"), label("caret_jobs_count_queued", "queued"))), + tags$span("\u2022"), + tags$span(tags$span(class = "cmp-count-dot", style = "background:#f6a100;"), paste(count("paused"), label("caret_jobs_count_paused", "paused"))), + tags$span("\u2022"), + tags$span(tags$span(class = "cmp-count-dot", style = "background:#4cae4c;"), paste(count("completed"), label("caret_jobs_count_completed", "completed"))), + if (count("completed") > 0) { + action_button("completed", "clear_completed", label("caret_jobs_clear_completed", "Clear completed"), "btn btn-xs btn-default") + } + ) + ), + tags$div(class = "cmp-list", rows), + tags$div( + class = "cmp-footer", + tags$i(class = "fa fa-info-circle"), + paste0(" ", label("caret_jobs_footer_note", "Completed models remain available for comparison and deployment.")) + ) + ) + }) + outputOptions(output, "caret_job_queue_panel", suspendWhenHidden = FALSE) +} diff --git a/server/caret_job_worker.R b/server/caret_job_worker.R new file mode 100644 index 0000000..7a5a5b9 --- /dev/null +++ b/server/caret_job_worker.R @@ -0,0 +1,209 @@ +caret_job_worker <- function(config_path) { + config <- readRDS(config_path) + if (!is.null(config$context_path)) { + config <- c(readRDS(config$context_path), config) + } + setwd(config$app_dir) + + status_path <- config$status_path + result_path <- config$result_path + + write_status <- function(status, step = status, message = NULL) { + saveRDS( + list( + status = status, + step = step, + message = message, + updated_at = Sys.time() + ), + status_path + ) + } + + rename_columns <- function(df, name_map) { + if (is.null(df) || !is.data.frame(df)) return(df) + matches <- match(names(df), name_map$original) + renamed <- !is.na(matches) + names(df)[renamed] <- name_map$safe[matches[renamed]] + df + } + + safe_name_map <- function(nms) { + data.frame( + original = nms, + safe = make.names(nms, unique = TRUE), + stringsAsFactors = FALSE + ) + } + + prepare_model_safe_names <- function(config) { + if (is.null(config$train_df) || !is.data.frame(config$train_df)) return(config) + + model_map <- safe_name_map(names(config$train_df)) + config$model_safe_name_map <- model_map + config$outcome_original <- config$outcome + + config$train_df <- rename_columns(config$train_df, model_map) + config$test_df <- rename_columns(config$test_df, model_map) + + outcome_idx <- match(config$outcome, model_map$original) + if (!is.na(outcome_idx)) { + config$outcome <- model_map$safe[[outcome_idx]] + } + if (!is.null(config$outcome) && config$outcome %in% names(config$train_df)) { + config$model_formula <- reformulate( + termlabels = setdiff(names(config$train_df), config$outcome), + response = config$outcome + ) + } + + if (!is.null(config$preprocessed)) { + for (nm in c("train_df", "train_dfdf", "test_df")) { + if (!is.null(config$preprocessed[[nm]]) && is.data.frame(config$preprocessed[[nm]])) { + config$preprocessed[[nm]] <- rename_columns(config$preprocessed[[nm]], model_map) + } + } + if (!is.null(config$preprocessed$original_df) && is.data.frame(config$preprocessed$original_df)) { + raw_map <- safe_name_map(names(config$preprocessed$original_df)) + config$raw_safe_name_map <- raw_map + config$preprocessed$original_df <- rename_columns(config$preprocessed$original_df, raw_map) + } + } + + config + } + + write_status("running", "training") + + tryCatch({ + suppressPackageStartupMessages({ + library(Rautoml) + library(caret) + library(caretEnsemble) + }) + + if (!is.null(config$seed) && !is.na(config$seed)) { + set.seed(config$seed) + } + + if (isTRUE(config$use_cluster)) { + Rautoml::start_cluster() + on.exit(try(Rautoml::stop_cluster(), silent = TRUE), add = TRUE) + } + + config <- prepare_model_safe_names(config) + + models <- Rautoml::train_caret_models( + df = config$train_df, + model_form = config$model_formula, + ctrl = config$train_control, + model_list = config$model_list, + metric = config$metric + ) + + write_status("running", "evaluating") + + tuned_parameters <- Rautoml::get_tuned_params(models) + control_parameters <- Rautoml::get_ctl_params( + models = models, + items = names(config$train_control) + ) + train_metrics_df <- Rautoml::extract_summary( + models, + summary_fun = Rautoml::student_t_summary + ) + + Rautoml::save_rautoml_csv( + object = train_metrics_df, + name = "training_performance_metrics", + dataset_id = config$dataset_id, + session_name = config$session_id, + timestamp = Sys.time(), + output_dir = file.path(config$app_username, "outputs") + ) + + test_metrics_objs <- Rautoml::boot_estimates_multiple( + models = models, + df = config$test_df, + outcome_var = config$outcome, + problem_type = config$task, + nreps = 100, + model_name = NULL, + type = "prob", + report = config$metric, + summary_fun = Rautoml::student_t_summary, + save_model = TRUE, + model_folder = file.path(config$app_username, "models"), + recipe_folder = file.path(config$app_username, "recipes"), + preprocesses = config$preprocessed + ) + + Rautoml::save_boot_estimates( + boot_list = test_metrics_objs, + dataset_id = config$dataset_id, + session_name = config$session_id, + timestamp = Sys.time(), + output_dir = file.path(config$app_username, "outputs"), + sub_dir = "test_metrics" + ) + + Rautoml::create_model_logs( + df_name = config$dataset_id, + session_name = config$session_id, + outcome = config$outcome, + framework = "Caret", + train_result = test_metrics_objs$all, + timestamp = Sys.time(), + path = file.path(config$app_username, ".log_files") + ) + + post_model_metrics_objs <- Rautoml::post_model_metrics( + models = models, + outcome = config$outcome, + df = config$test_df, + task = config$task + ) + + write_status("running", "saving") + + Rautoml::save_post_metrics_plots( + metric_list = post_model_metrics_objs, + dataset_id = config$dataset_id, + session_name = config$session_id, + timestamp = Sys.time(), + output_dir = file.path(config$app_username, "outputs") + ) + + saveRDS( + list( + model_id = config$model_id, + model_label = config$model_label, + models = models, + tuned_parameters = tuned_parameters, + control_parameters = control_parameters, + train_metrics_df = train_metrics_df, + test_metrics_objs = test_metrics_objs, + post_model_metrics_objs = post_model_metrics_objs, + model_safe_name_map = config$model_safe_name_map, + raw_safe_name_map = config$raw_safe_name_map, + completed_at = Sys.time() + ), + result_path + ) + + write_status("completed", "ready") + invisible(TRUE) + }, error = function(e) { + write_status("failed", "failed", conditionMessage(e)) + saveRDS( + list( + model_id = config$model_id, + model_label = config$model_label, + error = conditionMessage(e), + failed_at = Sys.time() + ), + result_path + ) + stop(e) + }) +} diff --git a/server/compare_trained_caret_models.R b/server/compare_trained_caret_models.R index 9b8633d..0750980 100644 --- a/server/compare_trained_caret_models.R +++ b/server/compare_trained_caret_models.R @@ -1,28 +1,26 @@ #### ---- Compare model metrics ----------------------------------- #### model_training_caret_train_metrics_server = function() { - - - # Fire on button click AND when train_metrics_df is set after training completes - # (so inner outputs get registered even on first run in a fresh session) - observeEvent(list(input$model_training_apply, rv_training_results$train_metrics_df), { + + ## Hoisted out of observeEvent — nested observers accumulate on every fire + observe({ + req(!is.null(rv_training_results$tuned_parameters)) + req(!is.null(rv_training_results$control_parameters)) + output$model_training_caret_train_tuned_parameters = renderUI({ + txt = capture.output(str(rv_training_results$tuned_parameters)) + pre(paste(txt, collapse = "\n")) + }) + output$model_training_caret_train_training_control = renderUI({ + txt = capture.output(str(rv_training_results$control_parameters)) + pre(paste(txt, collapse = "\n")) + }) + }) + + # Fire only when results are available after training completes + observeEvent(rv_training_results$train_metrics_df, { if (isTRUE(!is.null(rv_current$working_df))) { if (isTRUE(!is.null(rv_ml_ai$preprocessed))) { if (isTRUE(!is.null(rv_training_results$train_metrics_df))) { - - observe({ - req(!is.null(rv_training_results$tuned_parameters)) - req(!is.null(rv_training_results$control_parameters)) - output$model_training_caret_train_tuned_parameters = renderUI({ - txt = capture.output(str(rv_training_results$tuned_parameters)) - pre(paste(txt, collapse = "\n")) - }) - - output$model_training_caret_train_training_control = renderUI({ - txt = capture.output(str(rv_training_results$control_parameters)) - pre(paste(txt, collapse = "\n")) - }) - }) ## Training data output$model_training_caret_train_metrics_plot = renderPlot({ diff --git a/server/model_training_setup.R b/server/model_training_setup.R index 4a0cbbc..e4d1bd8 100644 --- a/server/model_training_setup.R +++ b/server/model_training_setup.R @@ -3,6 +3,9 @@ model_training_setup_server = function() { + output$model_training_setup_presetup <- renderUI({ NULL }) + outputOptions(output, "model_training_setup_presetup", suspendWhenHidden = FALSE) + observeEvent(input$feature_engineering_apply, { if (isTRUE(!is.null(rv_current$working_df))) { diff --git a/server/setup_models.R b/server/setup_models.R index ab03b2b..7abc758 100644 --- a/server/setup_models.R +++ b/server/setup_models.R @@ -1,20 +1,27 @@ #### ---- AI/ML UIs ---------------------------- #### setup_models_ui = function() { - - ## Session name - observeEvent(input$manage_data_apply, { + + ## Session name — watch working_df directly so there is no timing race + ## between manage_data_apply firing and working_df being set by select_data. + ## Only re-render when the input is empty — preserves value if already filled, + ## preventing setup_models_analysis_apply's drop_variables() from wiping it. + observe({ if (isTRUE(!is.null(rv_current$working_df))) { - output$setup_models_analysis_session_name = renderUI({ - textInput("setup_models_analysis_session_name" - , label = get_rv_labels("setup_models_analysis_session_name") - , value = "" - , width = NULL - , placeholder = get_rv_labels("setup_models_analysis_session_name_ph") - ) - }) + existing <- isolate(input$setup_models_analysis_session_name) + if (is.null(existing) || !nzchar(existing)) { + output$setup_models_analysis_session_name = renderUI({ + textInput("setup_models_analysis_session_name" + , label = get_rv_labels("setup_models_analysis_session_name") + , value = "" + , width = NULL + , placeholder = get_rv_labels("setup_models_analysis_session_name_ph") + ) + }) + outputOptions(output, "setup_models_analysis_session_name", suspendWhenHidden = FALSE) + } } else { output$setup_models_analysis_session_name = NULL - updateTextInput(session , "setup_models_analysis_session_name", value="") + updateTextInput(session, "setup_models_analysis_session_name", value="") } }) diff --git a/server/train_caret_models.R b/server/train_caret_models.R index 0b280b3..2680d11 100644 --- a/server/train_caret_models.R +++ b/server/train_caret_models.R @@ -1,3 +1,5 @@ +source("server/caret_job_manager.R", local = TRUE) + #### ---- Train all models ----------------------------------- #### model_training_caret_train_all_server = function() { @@ -615,29 +617,70 @@ model_training_caret_train_all_server = function() { } }) + ## Register placeholders so outputOptions can be called before the real renderUI + output$model_training_caret_models_ui <- renderUI({ NULL }) + output$model_training_apply <- renderUI({ NULL }) + outputOptions(output, "model_training_caret_models_ui", suspendWhenHidden = FALSE) + outputOptions(output, "model_training_apply", suspendWhenHidden = FALSE) + + ## After feature engineering fires, pre-warm all model checkbox/advance outputs + ## so navigating to Train model does not trigger 40+ sequential round-trips. + observeEvent(input$feature_engineering_apply, { + req(!is.null(rv_ml_ai$preprocessed)) + later::later(function() { + # Model IDs — match the keys used in model_training_caret_models.R + all_ids <- c("ols","rf","gbm","xgbTree","xgbLinear","svmRadial", + "svmLinear","svmPoly","glmnet","lasso","ridge","knn", + "nnet","treebag","avNNet","pls","gam","rpart", + "mlpWeightDecayML","naive_bayes") + no_advance <- c("treebag", "gam") # these have no advance options panel + ols_special <- "ols" # ols uses a different suffix + + check_ids <- paste0("model_training_caret_models_", all_ids, "_check") + adv_std <- paste0("model_training_caret_models_", + setdiff(all_ids, c(no_advance, ols_special)), + "_advance_params") + adv_ols <- "model_training_caret_models_ols_advance_intercept" + + for (id in c(check_ids, adv_std, adv_ols)) { + tryCatch( + outputOptions(output, id, suspendWhenHidden = FALSE), + error = function(e) NULL + ) + } + }, delay = 0.25) + }, ignoreInit = TRUE) + ## Train model action - observe({ - output$model_training_apply = renderUI({ - if (isTRUE(!is.null(rv_current$working_df))) { - if (isTRUE(!is.null(rv_ml_ai$preprocessed))) { - if (isTRUE(rv_ml_ai$at_least_one_model)) { - p(br() - , actionBttn("model_training_apply" - , inline=TRUE - , block = FALSE - , color = "success" - , label = get_rv_labels("model_training_apply") - ) - ) + output$model_training_apply = renderUI({ # re-registers; outputOptions re-applied below + if (isTRUE(!is.null(rv_current$working_df))) { + if (isTRUE(!is.null(rv_ml_ai$preprocessed))) { + if (isTRUE(rv_ml_ai$at_least_one_model)) { + button_label <- if (isTRUE(rv_training_results$training_busy) || isTRUE(rv_training_results$training_completed)) { + add_label <- tryCatch(as.character(get_rv_labels("caret_jobs_add_selected")), error = function(e) NULL) + if (is.null(add_label) || !length(add_label) || is.na(add_label[[1]]) || !nzchar(add_label[[1]])) { + "Add selected models to queue" + } else { + add_label[[1]] + } + } else { + get_rv_labels("model_training_apply") } + p(br() + , actionBttn("model_training_apply" + , inline=TRUE + , block = FALSE + , color = "success" + , label = button_label + ) + ) } } - }) + } }) ## Model list - observe({ - output$model_training_caret_models_ui = renderUI({ + output$model_training_caret_models_ui = renderUI({ if (isTRUE(!is.null(rv_current$working_df))) { if (isTRUE(!is.null(rv_ml_ai$preprocessed))) { p(br() @@ -738,343 +781,24 @@ model_training_caret_train_all_server = function() { ) } } - }) }) - - ## Train models - observeEvent(input$model_training_apply, { - start_progress_bar <- function(id, att_new_obj, text) { - rv_training_results$training_busy <- TRUE - rv_training_results$training_completed <- FALSE - } - close_progress_bar <- function(att_new_obj) { - if (!isTRUE(rv_training_results$training_busy)) return(invisible(NULL)) - rv_training_results$training_busy <- FALSE - session$sendCustomMessage("caretModelProgressComplete", list( - success = isTRUE(rv_training_results$training_completed) - )) - } - - if (isTRUE(!is.null(rv_current$working_df))) { - if (isTRUE(!is.null(rv_ml_ai$preprocessed))) { - if (isTRUE(rv_ml_ai$at_least_one_model)) { - - start_progress_bar(id="model_training_caret_pb", att_new_obj=model_training_caret_pb, text=get_rv_labels("model_training_apply_progress_bar")) - - models_state <- reactiveValuesToList(rv_training_models) - all_model_params <- do.call(c, Filter(Negate(is.null), lapply(rv_training_models$CARET_MODEL_IDS, function(id) { - models_state[[paste0(id, "_model")]] - }))) - set.seed(rv_ml_ai$seed_value) - - rv_training_results$training_completed = FALSE - - if (isTRUE(input$model_training_setup_start_clusters_check)) { - Rautoml::start_cluster() - } - - rv_training_results$models = tryCatch({ - Rautoml::train_caret_models( - df=rv_ml_ai$preprocessed$train_df - , model_form=rv_ml_ai$model_formula - , ctrl=reactiveValuesToList(rv_train_control_caret) - , model_list=all_model_params - , metric=input$model_training_setup_eval_metric - ) - }, error = function(e) { - shinyalert::shinyalert("Error: ", paste0(get_rv_labels("model_training_error"), "\n", e$message), type = "error") - if (isTRUE(input$model_training_setup_start_clusters_check)) Rautoml::stop_cluster() - close_progress_bar(att_new_obj=model_training_caret_pb) - return(NULL) - }) - - - if (isTRUE(input$model_training_setup_start_clusters_check)) { - Rautoml::stop_cluster() - } - - - if (isTRUE(is.null(rv_training_results$models))) return() - - if (isTRUE(input$model_training_setup_include_ensemble_check)) { - rv_training_results$models = tryCatch({ - Rautoml::create_ensemble( - all.models = rv_training_results$models - , ctrl=reactiveValuesToList(rv_train_control_caret) - , metric=input$model_training_setup_eval_metric - ) - }, error = function(e) { - shinyalert::shinyalert("Error: ", paste0(get_rv_labels("model_training_error"), "\n", e$message), type = "error") - close_progress_bar(att_new_obj=model_training_caret_pb) - return(NULL) - }) - } - - rv_training_results$training_completed = TRUE - rv_ml_ai$at_least_one_model = FALSE - for (cb in rv_training_models$CARET_MODEL_IDS) { - updatePrettyCheckbox(session, - inputId = paste0("model_training_caret_models_", cb, "_check"), - value = FALSE) - } - -## rv_training_models$ols_model = NULL -## rv_training_models$rf_model = NULL -## rv_training_models$gbm_model = NULL -## rv_training_models$xgbTree_model = NULL -## rv_training_models$xgbLinear_model = NULL -## rv_training_models$svmRadial_model = NULL -## rv_training_models$svmLinear_model = NULL -## rv_training_models$svmPoly_model = NULL -## rv_training_models$glmnet_model = NULL -## rv_training_models$lasso_model = NULL -## rv_training_models$ridge_model = NULL -## rv_training_models$knn_model = NULL -## rv_training_models$nnet_model = NULL -## -## rv_train_control_caret$method = "cv" -## rv_train_control_caret$number = 5 -## rv_train_control_caret$repeats = NA -## rv_train_control_caret$search = "grid" -## rv_train_control_caret$verboseIter = FALSE -## rv_train_control_caret$savePredictions = FALSE -## rv_train_control_caret$classProbs = TRUE -## - - if (isTRUE(is.null(rv_training_results$models))) return() - - rv_training_results$tuned_parameters = tryCatch({ - Rautoml::get_tuned_params(rv_training_results$models) - }, error=function(e) { - shinyalert::shinyalert("Error: ", paste0(get_rv_labels("model_train_metrics_error"), "\n", e$message), type = "error") - close_progress_bar(att_new_obj=model_training_caret_pb) - return(NULL) - }) - - if (is.null(rv_training_results$tuned_parameters)) return() - - rv_training_results$control_parameters = tryCatch({ - Rautoml::get_ctl_params(models=rv_training_results$models - , items=names(reactiveValuesToList(rv_train_control_caret)) - ) - }, error=function(e) { - shinyalert::shinyalert("Error: ", paste0(get_rv_labels("model_train_metrics_error"), "\n", e$message), type = "error") - close_progress_bar(att_new_obj=model_training_caret_pb) - return(NULL) - }) - - if (is.null(rv_training_results$control_parameters)) return() - - rv_training_results$train_metrics_df=tryCatch({ - Rautoml::extract_summary(rv_training_results$models, summary_fun=Rautoml::student_t_summary) - }, error = function(e) { - shinyalert::shinyalert("Error: ", paste0(get_rv_labels("model_train_metrics_error"), "\n", e$message), type = "error") - close_progress_bar(att_new_obj=model_training_caret_pb) - return(NULL) - }) - - - if (is.null(rv_training_results$train_metrics_df)) return() - - ## Save training performance metrics locally - - save_training = tryCatch({ - Rautoml::save_rautoml_csv(object=rv_training_results$train_metrics_df - , name="training_performance_metrics" - , dataset_id=rv_ml_ai$dataset_id - , session_name=rv_ml_ai$session_id - , timestamp=Sys.time() - , output_dir=paste0(app_username, "/outputs") - ) - invisible(TRUE) - }, error=function(e) { - shinyalert::shinyalert("Error: ", paste0(get_rv_labels("general_error_alert"), "\n", e$message), type = "error") - return(NULL) - }) - - if (is.null(save_training)) { - close_progress_bar(att_new_obj=model_training_caret_pb) - return() - } - - ## Test metrics - rv_training_results$test_metrics_objs=tryCatch({ - Rautoml::boot_estimates_multiple( - models=rv_training_results$models - , df=rv_ml_ai$preprocessed$test_df - , outcome_var=rv_ml_ai$outcome - , problem_type=rv_ml_ai$task - , nreps=100 - , model_name=NULL - , type="prob" - , report= input$model_training_setup_eval_metric - , summary_fun=Rautoml::student_t_summary - , save_model = TRUE - , model_folder = paste0(app_username, "/models") - , recipe_folder = paste0(app_username, "/recipes") - , preprocesses = rv_ml_ai$preprocessed - ) - }, error = function(e) { - shinyalert::shinyalert("Error: ", paste0(get_rv_labels("model_test_metrics_error"), "\n", e$message), type = "error") - close_progress_bar(att_new_obj=model_training_caret_pb) - return(NULL) - }) - - if (is.null(rv_training_results$test_metrics_objs)) return() - - ## Save test performance metrics - - save_test = tryCatch({ - Rautoml::save_boot_estimates(boot_list=rv_training_results$test_metrics_objs - , dataset_id=rv_ml_ai$dataset_id - , session_name=rv_ml_ai$session_id - , timestamp=Sys.time() - , output_dir=paste0(app_username, "/outputs") - , sub_dir="test_metrics" - ) - invisible(TRUE) - }, error=function(e) { - shinyalert::shinyalert("Error: ", paste0(get_rv_labels("general_error_alert"), "\n", e$message), type = "error") - return(NULL) - }) - - if (is.null(save_test)) { - close_progress_bar(att_new_obj=model_training_caret_pb) - return() - } - - ## Generate logs - save_logs = tryCatch({ - Rautoml::create_model_logs( - df_name=rv_ml_ai$dataset_id - , session_name=rv_ml_ai$session_id - , outcome=rv_ml_ai$outcome - , framework=input$modelling_framework_choices - , train_result=rv_training_results$test_metrics_objs$all - , timestamp=Sys.time() - , path=paste0(app_username, "/.log_files") - ) - invisible(TRUE) - }, error=function(e) { - shinyalert::shinyalert("Error: ", paste0(get_rv_labels("general_error_alert"), "\n", e$message), type = "error") - return(NULL) - }) - - if (is.null(save_logs)) { - close_progress_bar(att_new_obj=model_training_caret_pb) - return() - } - - - ## More metrics - ### Post metrics - rv_training_results$post_model_metrics_objs=tryCatch({ - Rautoml::post_model_metrics( - models=rv_training_results$models - , outcome=rv_ml_ai$outcome - , df=rv_ml_ai$preprocessed$test_df - , task=rv_ml_ai$task - ) - }, error = function(e) { - shinyalert::shinyalert("Error: ", paste0(get_rv_labels("model_post_metrics_error"), "\n", e$message), type = "error") - close_progress_bar(att_new_obj=model_training_caret_pb) - return(NULL) - }) - - if (is.null(rv_training_results$post_model_metrics_objs)) return() - - ## Save post model objects - save_post = tryCatch({ - Rautoml::save_post_metrics_plots(metric_list=rv_training_results$post_model_metrics_objs - , dataset_id=rv_ml_ai$dataset_id - , session_name=rv_ml_ai$session_id - , timestamp=Sys.time() - , output_dir=paste0(app_username, "/outputs") - ) - invisible(TRUE) - }, error=function(e) { - shinyalert::shinyalert("Error: ", paste0(get_rv_labels("general_error_alert"), "\n", e$message), type = "error") - return(NULL) - }) - - if (is.null(save_post)) { - close_progress_bar(att_new_obj=model_training_caret_pb) - return() - } - - close_progress_bar(att_new_obj=model_training_caret_pb) - } else { - rv_training_results$models = NULL - rv_training_results$train_metrics_df = NULL - rv_training_results$test_metrics_objs = NULL - rv_training_results$post_model_metrics_objs = NULL - rv_training_results$tuned_parameters = NULL - rv_training_results$control_parameters = NULL - - close_progress_bar(att_new_obj=model_training_caret_pb) - } - } else { - rv_training_results$models = NULL - rv_training_results$train_metrics_df = NULL - rv_training_results$test_metrics_objs = NULL - rv_training_results$post_model_metrics_objs = NULL - rv_training_results$tuned_parameters = NULL - rv_training_results$control_parameters = NULL - close_progress_bar(att_new_obj=model_training_caret_pb) - } - } else { - rv_training_results$models = NULL - rv_training_results$train_metrics_df = NULL - rv_training_results$test_metrics_objs = NULL - rv_training_results$post_model_metrics_objs = NULL - rv_training_results$tuned_parameters = NULL - rv_training_results$control_parameters = NULL - close_progress_bar(att_new_obj=model_training_caret_pb) - } - }) - - ## Reactive label outputs for the progress panel (reads from labelling file, updates on language change) - output$cmp_panel_title_ui <- renderUI({ get_rv_labels("cmp_panel_title") }) - output$cmp_footer_ui <- renderUI({ - tagList(tags$i(class = "fa fa-info-circle"), paste0(" ", get_rv_labels("cmp_footer_note"))) - }) - output$cmp_labels_json <- renderUI({ - tags$div( - id = "cmp-labels-data", - style = "display:none!important;position:absolute;height:0;overflow:hidden;", - `data-word-training` = get_rv_labels("cmp_word_training"), - `data-word-completed` = get_rv_labels("cmp_word_completed"), - `data-status-training` = get_rv_labels("cmp_status_training"), - `data-status-completed` = get_rv_labels("cmp_status_completed"), - `data-status-stopped` = get_rv_labels("cmp_status_stopped"), - `data-badge-done` = get_rv_labels("cmp_badge_done"), - `data-badge-failed` = get_rv_labels("cmp_badge_failed") + outputOptions(output, "model_training_caret_models_ui", suspendWhenHidden = FALSE) + outputOptions(output, "model_training_apply", suspendWhenHidden = FALSE) + + caret_job_manager_server( + input = input, + output = output, + session = session, + rv_current = rv_current, + rv_ml_ai = rv_ml_ai, + rv_training_models = rv_training_models, + rv_train_control_caret = rv_train_control_caret, + rv_training_results = rv_training_results, + app_username = app_username, + get_rv_labels = get_rv_labels ) - }) - outputOptions(output, "cmp_panel_title_ui", suspendWhenHidden = FALSE) - outputOptions(output, "cmp_footer_ui", suspendWhenHidden = FALSE) - outputOptions(output, "cmp_labels_json", suspendWhenHidden = FALSE) - - ## Provide selected model names as JSON for the JS click handler on the progress panel - output$caret_selected_models_json <- renderUI({ - models_state <- reactiveValuesToList(rv_training_models) - models <- Filter(Negate(is.null), lapply(rv_training_models$CARET_MODEL_IDS, function(id) { - if (!isTRUE(input[[paste0("model_training_caret_models_", id, "_check")]])) return(NULL) - nm <- models_state[[paste0(id, "_name")]] - if (is.null(nm)) return(NULL) - disp <- if (!is.null(names(nm)) && nzchar(names(nm)[1])) names(nm)[1] else as.character(nm[1]) - list(name = disp) - })) - models_json <- if (length(models) > 0) as.character(jsonlite::toJSON(models, auto_unbox = TRUE)) else "[]" - tags$div( - id = "caret-selected-models-data", - style = "display:none!important;position:absolute;height:0;overflow:hidden;", - `data-models` = models_json - ) - }) - outputOptions(output, "caret_selected_models_json", suspendWhenHidden = FALSE) -## observe({ + ## observe({ ## req(!isTRUE(rv_training_results$training_completed), isTRUE(!is.null(rv_training_results$training_completed))) ## req(isTRUE(!is.null(rv_current$working_df))) ## req(isTRUE(!is.null(rv_ml_ai$preprocessed))) diff --git a/static_files/labelling_file.xlsx b/static_files/labelling_file.xlsx index f1d31562a30c7b0a5ef26f416f63ba9f2cddce58..b5906411dc018c230a801e0fc466926d560f3747 100644 GIT binary patch delta 356566 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

B=zD|hlI--T#`-t1UG_re2EH9~h8Ucr zvn*jx%YxW*f^d1`GO3T0e+@-^lvchBtVb{>*+Df>8`*-W>~YXI_#I$zH@+X7>8jL& zb(c`VzEiHY3L>#f#D?$Yrhl88=ykH(4J)zhJ!`z!^`Ui(*tNxaQS5SByGdL-tnm`p zXVxu}%l*P?FO!@_P9f1MHaFP#6wqqLlUFs8@o3H6!zf2iW{4727!-Y^=&A4#J=N*G z)oDWq<6oYCtSf|1=k^1oo5N*Y2h}!NBpWrJ!(ZiNrg}`zy;TPOXjhcwb1z4ei5q-I zSh4+^B3t2b?Tf_as&Rnw^ugUBkiSh}q29ii|4)X3v74!l7^#Foevh(Y)CgT6b@)LG zpVJ&j$CR;`mskZeFUWnU-(&dqG1MEm5$m4vuE(?q z!+xB;V-KS#G4|FMthdc%-rWSE+@OB7hFm~+r!)}u)XFxgtYjx+0bE$+Mk{D2_#Ms zg~H-D)f(#Tvsx!kX6ABbkao`4b=@pp4KwLh&2D%-)&CxqlSL`*>PakOY2nW~{rwwI zw3mxA1YcC`eaf?k3h6%mtxixV$GpN-i7AqQS7MUX;=BO@-vi>XyVv&}*KYPzR zu;GN+0*4>uTd2b`$!9TA?~N7?$R<1w6k)uR_otdDAh?M_HVW~zjs3|+UT*XaUap;U z%5I0iuO)`RCiD=$^+NYc)av{Ah-8tj&2^fjn{u5#(ob`pzEW4N(@*+CuG1_n&UN}r zFXuWfQcj*TK&r`e21+~TIXg&u0nb<>?3dX3`jeSVVs z$IuJf^G;WibEwD8NQr?%G&>q0Jw{2(kRAh!wurT0UZv?nIqMCIma#oaaAX^bogPY* zABK!9Wf0rHJFvz{`a(>$fDdQ(q0e#LZjlpC{3f%Ch8=WG96H!vv;Y$0HGScs-Ll2Z zoQqGV=i)TaL;nw@Qs6-khC%E*$RmHHoY$8O$#F$)fe->h2&ciue4ZIDzAVp&gj7?& z8)-8B?aiM7&7V`CKx2%6Pb2kVpseHwA!9f*A|N6$3G)7hD|2-P4fcQF6w)-PWMRoT=K{o5aQtEEVWATa9})y{Dv0Sp zgQYT{rLvQ`o(_!@@^%>u%?ImulSCtv^(L6Iz=P&(!a1Yg3X^@a%4OmyQDUH5sYSWeW?9U$pbhH zudPVKKu4ublaJuv35AZ9%5jjN$~fsunyF25A86Y|#A9ixuU5(*WTu{IW03%#8u?m0 z2zzO4a;}p9H5-mxm-(?@oCifL|1gN*@)ZqLzz0|ba2N?oZe&9e92S$8-lL&FWB7N* znHU|dm=d+qlIEvp7%lW@53WT{~f8)A<8N=b)W4nL3g?Fc$b zRRRffMM0e6{GO2L%k${UQrjvGM_9K7`nA6PxR*vtaK>u5wpk^G&lgDK?34KLH1d<# z)WUaFkF);Wn`$8FS897g*l(&7Mkd`RT#z=qjm-?x+U7QTs7eiGiyD4ftCGNi&y@=5 z;nR2^Dd##>2-1oFLpNj~=yJ(s!&5)niA7A+SwKI z`v`ogumYhJZ{j=air$8F+HCiwLZZ!6;rlVRQCD{wKnY&@tCwg3^c7Q`X7Qh3w2}%i24*CaWW}v}|{Bv9^i+dsM-| zc*5YoQOjpy6E*d`0apU8f=fxC+{8Zp5~v*fjz(YJS3oEkVX%6D(gYj1>fThwi_+;VC>?}f zj}nC@_8t|m;>8`Qyh}Rdxc>VYTLkoxaC>tve$?q4Ze0&XM}>`je*f{x=tDeeTL$AAg`;~huv`~Y{=(zfSz4VB@i=4 z9&yKCAFI47&6+Ir6wQ55()Td?u%C-H)^`TS=y@ z0C^OH1twBpu4Q>ifE_)<`{jmc2(0IHgHLAZov=plYvNQ6eGOvyf)3P}R~00u{P)9I zCfA(n=@la49Gb>Se)~)&(ezS~7s&q-EZxvqzR-Q(;5)@PYPP9KZxod~4MA0d(23O-Mo=9Lmu+qsG@YMiU|~0J-Waq zq6^%#_B5m4j{ivmc8LND%!w%1J;^i=*6+iQWzP|6;JYK@F3{manSnjw1er1g0jj9d zg;?fTRY$7B5)poLGk+oGi3e+&;xaH%&ZG&i8^qEYqFY!3V}iMA_B0EOjy34u@F!dy z99gQ+LWYz3n1|`>e3L6?`-Vf}7G6h4iSaX0r{@VC;V`o05baf4(l*`>$8DJXGLaAM zq>7#v^hE&ZTS_Ms*WxY@9)M8Ly&rO;Xr>%bU0J-s2>JW5qFVDT--jBt&lJUBa(jXP zTq5Svu6DUm?nm1cb#p0YD=kwGxg9XL&n&=_7$M7Q&Yq}XLg@~HxzGD)p~pIXXE^*B zZaLDljht2eWiw0nthWz&Ksc-wZ!eO4O?anEqM)Df`>3*oeMY_}+`NsUeW3tE`b zTM$Ye3KpPtJF}tjx7tD(8oAcv(O1v{;lc7!i2KoR4lMpuLU|1a1JgC(aA>wv%7Gg< zKBYcwLA$}m>7N$ZIg(H+XNeluq1oNf6uzSuS%0frSXiSz$X4_gjHXzzd~FkNL6uS* zMnr|=oUpbL7c?Zl-eZ+z4?;+Oag%-<>9%1<{%>CsreXONY5~^3O}sbT`Uz=908pq~ zBL=FAWF6sG(bj3yA6nHx;Kxwp1T3D zp6-lXu3iz?q$5xI@dUibzoBuPn>FL4vyRG~VbLM8;Vf6fQG{)P+#lL-SNFNS26?Z2+rmvCjYqU*JPEy;K?R)#1ebSl+=b0SYf=D(7F+Q@owbl(qNDsH>X{`pB3MFB-_K#2L>+ImntBwNY}E z^+$>?+THmk=+!_-h}Z07W+~=XTvy-h0gmI&%oRA$9QqkqhaDg`-L#Q~Z7dW>AZ;v@ zmpS(T**o)qDC_P2|7PD8W@CUEW<~{f8C(DbS#vkVOfyYo?79FhV2Ww#sKD4FiW`R# z6V$X^a&Y0Pun;Ck%T&-*k`xh_$^~#kMVQ}t1_3GT*1g{wgZhs?z*u~q^I6X4EU!22 z53S}(>fQ}o4w~<<4WCiat zVzGw)q-W7$HaupI+bYUXF2^>GR%y#2Hs{GFFq^n9IFeUHqR3=S>NyQ?-rgH<}k@JrkrIz4_IXxoj#(VJwtX7O0o_D(KC2SqS>x0y-S{9&IKT&7U?_fC5E?0X)h+NwNq(KrXWeg^_H35`t zBDR+Z(O2ac*sg?eAM^btpY6ZAI!Zm-r z0B3pnNKPhP5OQXdMet(E6)5pwcTTy&mr$$TB%`DqAn*!bN+G~7LlQulLzrihb3ErN z-<7z}BNz1_%iuY;hVH1;*vba_6DtJ_gn|!dS|;h2F)dO0ADEWudOpiCQ$LtxiPJA* zS?1|~U|AOG`E1J){b07mq+iCiys!U(ZCS48b1bX$gE^KI{W6Z_BmEB?%g1^?*RoMR zm}}XhU≫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 Mvfy)7Ghu@N2Y(A@NdN!< delta 267349 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 #_VFxmec3Fn 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⪻+p97M>C|H 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 OZ%> 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�<)8ZDAHOTBc!g3D@akk8RIu;Q=-;RO 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

' + - '
' + lbl('status-training') + '
' + - '
' + - '
' + - '
'; - list.appendChild(row); - }); - - panel.querySelector('#cmp-count-training').textContent = models.length + ' ' + lbl('word-training'); - panel.querySelector('#cmp-count-done').textContent = '0 ' + lbl('word-completed'); - panel.classList.add('cmp-visible'); - } - - function cmpComplete(success) { - var panel = document.getElementById('caret-model-progress'); - if (!panel) return; - - var rows = panel.querySelectorAll('.cmp-row'); - var n = rows.length; - - rows.forEach(function (row) { - var bar = row.querySelector('.cmp-bar'); - var sdot = row.querySelector('.cmp-sdot'); - var slabel = row.querySelector('.cmp-slabel'); - var pct = row.querySelector('.cmp-pct-val'); - var action = row.querySelector('.cmp-action'); - - bar.classList.remove('cmp-running'); - - if (success) { - bar.classList.add('cmp-done'); - sdot.style.background = '#4cae4c'; - slabel.textContent = lbl('status-completed'); - pct.textContent = '100%'; - action.innerHTML = '
' + lbl('badge-done') + '
'; - } else { - bar.classList.add('cmp-error'); - sdot.style.background = '#d9534f'; - slabel.textContent = lbl('status-stopped'); - pct.textContent = ''; - action.innerHTML = '
' + lbl('badge-failed') + '
'; - } - }); - - if (success) { - panel.querySelector('#cmp-count-training').textContent = '0 ' + lbl('word-training'); - panel.querySelector('#cmp-count-done').textContent = n + ' ' + lbl('word-completed'); - } - } - - // On button click: read pre-computed model list from hidden div and show panel - document.addEventListener('click', function (e) { - var btn = e.target.closest && e.target.closest('#model_training_apply'); - if (!btn) return; - var dataEl = document.getElementById('caret-selected-models-data'); - if (!dataEl) return; - var models = []; - try { models = JSON.parse(dataEl.getAttribute('data-models') || '[]'); } catch (ex) {} - cmpInit(models); - }); - - Shiny.addCustomMessageHandler('caretModelProgressComplete', function (msg) { - cmpComplete(msg && msg.success === true); - }); - - // Click DONE or FAILED badge → dismiss that row, hide panel if empty - function dismissBadgeRow(selector) { - document.addEventListener('click', function (e) { - var badge = e.target.closest && e.target.closest(selector); - if (!badge) return; - var panel = document.getElementById('caret-model-progress'); - if (!panel) return; - var row = badge.closest('.cmp-row'); - if (row) row.remove(); - var remaining = panel.querySelectorAll('.cmp-row').length; - if (remaining === 0) { - panel.classList.remove('cmp-visible'); - } else { - panel.querySelector('#cmp-count-done').textContent = remaining + ' ' + lbl('word-completed'); - } - }); - } - dismissBadgeRow('.cmp-badge-done'); - dismissBadgeRow('.cmp-badge-error'); - })(); - ")) - ), - fluidRow( - conditionalPanel( - condition = "input.modelling_framework_choices == 'Caret'", - column(width = 12, - uiOutput("caret_selected_models_json"), - uiOutput("cmp_labels_json") - ), - column(width = 12, - div( - id = "caret-model-progress", - div(class = "cmp-header", - div(class = "cmp-title", uiOutput("cmp_panel_title_ui")), - div(class = "cmp-counts", - tags$span( - tags$span(class = "cmp-count-dot", style = "background:#2196f3;"), - tags$span(id = "cmp-count-training", "0 training") - ), - tags$span("•"), - tags$span( - tags$span(class = "cmp-count-dot", style = "background:#4cae4c;"), - tags$span(id = "cmp-count-done", "0 completed") - ) - ) - ), - div(class = "cmp-list"), - div(class = "cmp-footer", uiOutput("cmp_footer_ui")) - ) - ), + ")) + ), + fluidRow( + conditionalPanel( + condition = "input.modelling_framework_choices == 'Caret'", + column(width = 12, + uiOutput("caret_job_queue_panel") + ), column(width = 12, uiOutput("model_training_setup_presetup") ), From 8b95af1b4842dbfe9e48ee283762ecdcdefe57c1 Mon Sep 17 00:00:00 2001 From: damiancodes Date: Fri, 3 Jul 2026 01:04:06 +0300 Subject: [PATCH 02/11] training button --- server/train_caret_models.R | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/server/train_caret_models.R b/server/train_caret_models.R index 2680d11..657667a 100644 --- a/server/train_caret_models.R +++ b/server/train_caret_models.R @@ -651,8 +651,20 @@ model_training_caret_train_all_server = function() { }, delay = 0.25) }, ignoreInit = TRUE) + observe({ + req(!is.null(rv_ml_ai$preprocessed)) + all_ids <- c("ols","rf","gbm","xgbTree","xgbLinear","svmRadial", + "svmLinear","svmPoly","glmnet","lasso","ridge","knn", + "nnet","treebag","avNNet","pls","gam","rpart", + "mlpWeightDecayML","naive_bayes") + any_checked <- any(vapply(all_ids, function(id) { + isTRUE(input[[paste0("model_training_caret_models_", id, "_check")]]) + }, logical(1))) + rv_ml_ai$at_least_one_model <- any_checked + }) + ## Train model action - output$model_training_apply = renderUI({ # re-registers; outputOptions re-applied below + output$model_training_apply = renderUI({ if (isTRUE(!is.null(rv_current$working_df))) { if (isTRUE(!is.null(rv_ml_ai$preprocessed))) { if (isTRUE(rv_ml_ai$at_least_one_model)) { From 4f15c352bb13be040e51b294a597417c7a336697 Mon Sep 17 00:00:00 2001 From: damiancodes Date: Fri, 3 Jul 2026 16:11:13 +0300 Subject: [PATCH 03/11] Fix model names, Explore dropdown, SHAP column mismatch and progress bar --- server/caret_job_manager.R | 11 ++++++++--- server/compare_trained_caret_models.R | 24 ++++++++++++++++++------ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/server/caret_job_manager.R b/server/caret_job_manager.R index 725c903..6b2e908 100644 --- a/server/caret_job_manager.R +++ b/server/caret_job_manager.R @@ -443,14 +443,17 @@ caret_job_manager_server <- function( results <- results[!vapply(results, is.null, logical(1))] if (!length(results)) return(invisible(NULL)) - models <- do.call(c, lapply(results, `[[`, "models")) + models_list <- lapply(results, `[[`, "models") + names(models_list) <- NULL + models <- do.call(c, models_list) class(models) <- unique(c("caretList", class(models))) rv_training_results$models <- models tuned <- do.call(c, lapply(results, `[[`, "tuned_parameters")) rv_training_results$tuned_parameters <- tuned - rv_training_results$control_parameters <- results[[1]]$control_parameters + rv_training_results$control_parameters <- results[[1]]$control_parameters + rv_training_results$model_safe_name_map <- results[[1]]$model_safe_name_map train_metrics <- do.call(rbind, lapply(results, `[[`, "train_metrics_df")) class(train_metrics) <- unique(c("Rautomlmetric", class(train_metrics))) @@ -468,7 +471,9 @@ caret_job_manager_server <- function( class(test_metrics) <- c("Rautomlmetric2", "list") rv_training_results$test_metrics_objs <- test_metrics - post_metrics <- do.call(c, lapply(results, `[[`, "post_model_metrics_objs")) + post_list <- lapply(results, `[[`, "post_model_metrics_objs") + names(post_list) <- NULL + post_metrics <- do.call(c, post_list) rv_training_results$post_model_metrics_objs <- post_metrics invisible(NULL) } diff --git a/server/compare_trained_caret_models.R b/server/compare_trained_caret_models.R index 0750980..e6a621d 100644 --- a/server/compare_trained_caret_models.R +++ b/server/compare_trained_caret_models.R @@ -718,11 +718,18 @@ model_training_caret_train_metrics_server = function() { } if (isTRUE(input$model_training_caret_test_metrics_trained_shap_switch_check)) { + shap_test_df <- rv_ml_ai$preprocessed$test_df + name_map <- rv_training_results$model_safe_name_map + if (!is.null(name_map) && is.data.frame(shap_test_df)) { + idx <- match(names(shap_test_df), name_map$original) + valid <- !is.na(idx) + names(shap_test_df)[valid] <- name_map$safe[idx[valid]] + } rv_training_results$test_metrics_objs_shap = tryCatch({ Rautoml::compute_shap( models=rv_training_results$models , model_names=gsub("\\ ", ".", input$model_training_caret_test_metrics_trained_models_shap) - , newdata=rv_ml_ai$preprocessed$test_df + , newdata=shap_test_df , response=rv_ml_ai$outcome , task=rv_ml_ai$task , nsim=50 @@ -736,9 +743,11 @@ model_training_caret_train_metrics_server = function() { return(NULL) }) - if (is.null(rv_training_results$test_metrics_objs_shap)) return() - - + if (is.null(rv_training_results$test_metrics_objs_shap)) { + close_progress_bar(att_new_obj=model_metrics_caret_pb) + return() + } + rv_training_results$shap_plots = tryCatch({ plot(rv_training_results$test_metrics_objs_shap) }, error=function(e){ @@ -746,8 +755,11 @@ model_training_caret_train_metrics_server = function() { close_progress_bar(att_new_obj=model_metrics_caret_pb) return(NULL) }) - - if (is.null(rv_training_results$shap_plots)) return() + + if (is.null(rv_training_results$shap_plots)) { + close_progress_bar(att_new_obj=model_metrics_caret_pb) + return() + } ## Save SHAP objects and plots save_shap = tryCatch({ From 7d7c25a6cc997e433c97d481c9c201b464710608 Mon Sep 17 00:00:00 2001 From: damiancodes Date: Fri, 3 Jul 2026 20:11:52 +0300 Subject: [PATCH 04/11] Fix model naming, SHAP column mismatch, progress bar looping and deploy retry --- server/compare_trained_caret_models.R | 29 ++++++++----- server/deploy_trained_caret_models.R | 59 +++++++++++++-------------- 2 files changed, 46 insertions(+), 42 deletions(-) diff --git a/server/compare_trained_caret_models.R b/server/compare_trained_caret_models.R index e6a621d..d768e3f 100644 --- a/server/compare_trained_caret_models.R +++ b/server/compare_trained_caret_models.R @@ -15,6 +15,11 @@ model_training_caret_train_metrics_server = function() { }) }) + ## Flag to ensure the SHAP Apply observer is only registered once. + ## Without this, observeEvent(train_metrics_df) re-registers it on every + ## model completion → progress bar fires N times for N completed models. + shap_apply_registered <- reactiveVal(FALSE) + # Fire only when results are available after training completes observeEvent(rv_training_results$train_metrics_df, { @@ -522,17 +527,18 @@ model_training_caret_train_metrics_server = function() { } }) - observeEvent(input$model_training_caret_test_metrics_trained_shap_apply, { - req(!is.null(rv_training_results$post_model_metrics_objs)) - req(!is.null(rv_training_models$all_trained_models)) - req(!is.null(rv_training_results$test_metrics_objs)) - req(!is.null(rv_training_models$all_trained_models)) - req(!is.null(input$model_training_caret_test_metrics_trained_models_shap)) - req(!is.null(input$model_training_caret_test_metrics_trained_models_options)) - req(isTRUE(length(input$model_training_caret_test_metrics_trained_models_options)>0)) + if (!isolate(shap_apply_registered())) { + shap_apply_registered(TRUE) + observeEvent(input$model_training_caret_test_metrics_trained_shap_apply, { + req(!is.null(rv_training_results$post_model_metrics_objs)) + req(!is.null(rv_training_models$all_trained_models)) + req(!is.null(rv_training_results$test_metrics_objs)) + req(!is.null(input$model_training_caret_test_metrics_trained_models_shap)) + req(!is.null(input$model_training_caret_test_metrics_trained_models_options)) + req(isTRUE(length(input$model_training_caret_test_metrics_trained_models_options)>0)) if (((isTRUE(input$model_training_caret_test_metrics_trained_models_options!="") | isTRUE(length(input$model_training_caret_test_metrics_trained_models_options)>0)) & isTRUE(!is.null(input$model_training_caret_test_metrics_trained_models_options))) | isTRUE(input$model_training_caret_test_metrics_trained_shap_switch_check)) { if (isTRUE(input$model_training_caret_test_metrics_trained_models_options!="") | isTRUE(length(input$model_training_caret_test_metrics_trained_models_options)>0)) { - + start_progress_bar(id="model_metrics_caret_pb", att_new_obj=model_metrics_caret_pb, text=get_rv_labels("model_metrics_apply_progress_bar")) rv_training_results$test_metrics_objs_filtered = tryCatch({ @@ -994,8 +1000,9 @@ model_training_caret_train_metrics_server = function() { } ## FIXME: Best way to reset SHAP values - rv_training_results$test_metrics_objs_shap = NULL - }) + rv_training_results$test_metrics_objs_shap = NULL + }, ignoreInit = TRUE) + } } else { output$model_training_caret_train_metrics_plot = NULL diff --git a/server/deploy_trained_caret_models.R b/server/deploy_trained_caret_models.R index da13b35..a1bf0ae 100644 --- a/server/deploy_trained_caret_models.R +++ b/server/deploy_trained_caret_models.R @@ -1,6 +1,8 @@ #### ---- Deploy trained model ------------------------------------- #### deploy_trained_caret_models = function() { + deploy_observers_registered <- reactiveVal(FALSE) + observeEvent({list(input$manage_data_apply, input$model_training_apply)}, { req(!is.null(rv_current$working_df)) req(!is.null(rv_current$dataset_id)) @@ -39,6 +41,11 @@ deploy_trained_caret_models = function() { ) }) + ## Register nested observers only once — prevents duplicate deploys + ## when manage_data_apply or model_training_apply fires multiple times. + if (!isolate(deploy_observers_registered())) { + deploy_observers_registered(TRUE) + ## Models in summary table observeEvent(input$deploy_trained_caret_models_select_session, { output$deploy_trained_caret_models_select_model = renderUI({ @@ -158,26 +165,20 @@ deploy_trained_caret_models = function() { if (isTRUE(d_check)) { u = rv_deployed_models[[m]]$url d = rv_deployed_models[[m]]$docs - if (Rautoml::check_api_connection(d)) { - df$url = u - df$api = d - df$status = "Deployed" - } else { + connected <- FALSE + for (.attempt in 1:5) { + if (Rautoml::check_api_connection(d)) { connected <- TRUE; break } Sys.sleep(3) - if (Rautoml::check_api_connection(d)) { - df$url = u - df$api = d - df$status = "Deployed" - } else { - df$url = "" - df$api = "" - df$status = "Stopped" - } + } + if (connected) { + df$url = u; df$api = d; df$status = "Deployed" + } else { + df$url = ""; df$api = ""; df$status = "Stopped" } } else { - df$url = "" - df$api = "" - df$status = "Stopped" + df$url = "" + df$api = "" + df$status = "Stopped" } deployed_df[[m]] = df } @@ -234,21 +235,15 @@ deploy_trained_caret_models = function() { if (isTRUE(d_check)) { u = rv_deployed_models[[info$id]]$url d = rv_deployed_models[[info$id]]$docs - if (Rautoml::check_api_connection(d)) { - display$url[i] = u - display$api[i] = d - display$status[i] = "Deployed" - } else { + connected <- FALSE + for (.attempt in 1:5) { + if (Rautoml::check_api_connection(d)) { connected <- TRUE; break } Sys.sleep(3) - if (Rautoml::check_api_connection(d)) { - display$url[i] = u - display$api[i] = d - display$status[i] = "Deployed" - } else { - display$url[i] = "" - display$api[i] = "" - display$status[i] = "Stopped" - } + } + if (connected) { + display$url[i] = u; display$api[i] = d; display$status[i] = "Deployed" + } else { + display$url[i] = ""; display$api[i] = ""; display$status[i] = "Stopped" } } else { display$url[i] = "" @@ -278,6 +273,8 @@ deploy_trained_caret_models = function() { }, server = FALSE) }, ignoreInit = TRUE) + } ## end deploy_observers_registered guard + ## Output objects output$deploy_trained_caret_models_box_ui = renderUI({ req(NROW(rv_deploy_models$trained_models_table)>0) From b9a6df0d582690808b502c61946bc2de54124a1a Mon Sep 17 00:00:00 2001 From: damiancodes Date: Fri, 3 Jul 2026 23:32:47 +0300 Subject: [PATCH 05/11] Pre-build model specs on feature engineering for instant Train button --- server/train_caret_models.R | 327 ++++++++++++------------------------ 1 file changed, 108 insertions(+), 219 deletions(-) diff --git a/server/train_caret_models.R b/server/train_caret_models.R index 657667a..fbacf0a 100644 --- a/server/train_caret_models.R +++ b/server/train_caret_models.R @@ -218,75 +218,81 @@ model_training_caret_train_all_server = function() { } }) - ## Check selected models - observe({ - if (isTRUE(!is.null(rv_current$working_df))) { - if (isTRUE(!is.null(rv_ml_ai$preprocessed))) { + ## Build model specs — fires on preprocessing complete OR any advance option save. + ## Does NOT depend on checkbox inputs so checkbox ticks are instant (fast observer). + observeEvent( + list( + rv_ml_ai$preprocessed, + input$ols_advance_control_apply_save, + input$rf_advance_control_apply_save, + input$gbm_advance_control_apply_save, + input$xgbTree_advance_control_apply_save, + input$xgbLinear_advance_control_apply_save, + input$svmRadial_advance_control_apply_save, + input$svmLinear_advance_control_apply_save, + input$svmPoly_advance_control_apply_save, + input$glmnet_advance_control_apply_save, + input$lasso_advance_control_apply_save, + input$ridge_advance_control_apply_save, + input$knn_advance_control_apply_save, + input$nnet_advance_control_apply_save, + input$avNNet_advance_control_apply_save, + input$pls_advance_control_apply_save, + input$rpart_advance_control_apply_save, + input$mlpWeightDecayML_advance_control_apply_save, + input$naive_bayes_advance_control_apply_save + ), + { + req(!is.null(rv_current$working_df)) + req(!is.null(rv_ml_ai$preprocessed)) + req(!is.null(rv_training_models$ols_name)) + { ## LM/GLM - if (isTRUE(input$model_training_caret_models_ols_check)) { + if (!is.null(rv_training_models$ols_name)) { if (isTRUE(rv_ml_ai$preprocessed$outcome_nlevels>2)) { param_set = list(intercept=as.numeric(input$model_training_caret_models_ols_advance_decay)) } else { param_set=list(intercept=input$model_training_caret_models_ols_advance_intercept) } - rv_training_models$ols_model = Rautoml::setup_caret( + rv_training_models$ols_model = Rautoml::setup_caret( rv_training_models$ols_name , param=rv_training_models$ols_param , param_set=param_set ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$ols_model = NULL } ## RF - if (isTRUE(input$model_training_caret_models_rf_check)) { - rv_training_models$rf_model = Rautoml::setup_caret( + if (!is.null(rv_training_models$rf_name)) { + rv_training_models$rf_model = Rautoml::setup_caret( rv_training_models$rf_name , param=rv_training_models$rf_param - , param_set=list( - mtry=as.numeric(input$model_training_caret_models_rf_advance_params_mtry) - ) + , param_set=list(mtry=as.numeric(input$model_training_caret_models_rf_advance_params_mtry)) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$rf_model = NULL } ## GBM - if (isTRUE(input$model_training_caret_models_gbm_check)) { - if (isTRUE(!is.null(input$model_training_caret_models_gbm_advance_shrinkage))) { - shrinkage = input$model_training_caret_models_gbm_advance_shrinkage - shrinkage = seq(shrinkage[1], shrinkage[2], length.out=20) - } else { - shrinkage = input$model_training_caret_models_gbm_advance_shrinkage - } - rv_training_models$gbm_model = Rautoml::setup_caret( + if (!is.null(rv_training_models$gbm_name)) { + shrinkage = input$model_training_caret_models_gbm_advance_shrinkage + if (!is.null(shrinkage)) shrinkage = seq(shrinkage[1], shrinkage[2], length.out=20) + rv_training_models$gbm_model = Rautoml::setup_caret( rv_training_models$gbm_name , param=rv_training_models$gbm_param , param_set=list( n.trees=as.numeric(input$model_training_caret_models_gbm_advance_n.trees) - , interaction.depth = as.numeric(input$model_training_caret_models_gbm_advance_interaction.depth) - , n.minobsinnode = as.numeric(input$model_training_caret_models_gbm_advance_n.minobsinnode) - , shrinkage = shrinkage + , interaction.depth=as.numeric(input$model_training_caret_models_gbm_advance_interaction.depth) + , n.minobsinnode=as.numeric(input$model_training_caret_models_gbm_advance_n.minobsinnode) + , shrinkage=shrinkage ) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$gbm_model = NULL } ## xgbTree - if (isTRUE(input$model_training_caret_models_xgbTree_check)) { - if (isTRUE(!is.null(input$model_training_caret_models_xgbTree_advance_eta))) { - eta = input$model_training_caret_models_xgbTree_advance_eta - eta = seq(eta[1], eta[2], length.out=20) - } else { - eta = input$model_training_caret_models_xgbTree_advance_eta - } - rv_training_models$xgbTree_model = Rautoml::setup_caret( + if (!is.null(rv_training_models$xgbTree_name)) { + eta = input$model_training_caret_models_xgbTree_advance_eta + if (!is.null(eta)) eta = seq(eta[1], eta[2], length.out=20) + rv_training_models$xgbTree_model = Rautoml::setup_caret( rv_training_models$xgbTree_name , param=rv_training_models$xgbTree_param , param_set=list( @@ -299,21 +305,13 @@ model_training_caret_train_all_server = function() { , subsample=as.numeric(input$model_training_caret_models_xgbTree_advance_subsample) ) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$xgbTree_model = NULL } - ## xgbLinear - if (isTRUE(input$model_training_caret_models_xgbLinear_check)) { - if (isTRUE(!is.null(input$model_training_caret_models_xgbLinear_advance_eta))) { - eta = input$model_training_caret_models_xgbLinear_advance_eta - eta = seq(eta[1], eta[2], length.out=20) - } else { - eta = input$model_training_caret_models_xgbLinear_advance_eta - } - rv_training_models$xgbLinear_model = Rautoml::setup_caret( + if (!is.null(rv_training_models$xgbLinear_name)) { + eta = input$model_training_caret_models_xgbLinear_advance_eta + if (!is.null(eta)) eta = seq(eta[1], eta[2], length.out=20) + rv_training_models$xgbLinear_model = Rautoml::setup_caret( rv_training_models$xgbLinear_name , param=rv_training_models$xgbLinear_param , param_set=list( @@ -323,138 +321,93 @@ model_training_caret_train_all_server = function() { , eta=eta ) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$xgbLinear_model = NULL } ## svmRadial - if (isTRUE(input$model_training_caret_models_svmRadial_check)) { - if (isTRUE(!is.null(input$model_training_caret_models_svmRadial_advance_sigma))) { - sigma = input$model_training_caret_models_svmRadial_advance_sigma - sigma = seq(sigma[1], sigma[2], length.out=20) - } else { - sigma = input$model_training_caret_models_svmRadial_advance_sigma - } - rv_training_models$svmRadial_model = Rautoml::setup_caret( + if (!is.null(rv_training_models$svmRadial_name)) { + sigma = input$model_training_caret_models_svmRadial_advance_sigma + if (!is.null(sigma)) sigma = seq(sigma[1], sigma[2], length.out=20) + rv_training_models$svmRadial_model = Rautoml::setup_caret( rv_training_models$svmRadial_name , param=rv_training_models$svmRadial_param - , param_set=list( - C=as.numeric(input$model_training_caret_models_svmRadial_advance_C) - , sigma=sigma - ) + , param_set=list(C=as.numeric(input$model_training_caret_models_svmRadial_advance_C), sigma=sigma) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$svmRadial_model = NULL } ## svmLinear - if (isTRUE(input$model_training_caret_models_svmLinear_check)) { - rv_training_models$svmLinear_model = Rautoml::setup_caret( + if (!is.null(rv_training_models$svmLinear_name)) { + rv_training_models$svmLinear_model = Rautoml::setup_caret( rv_training_models$svmLinear_name , param=rv_training_models$svmLinear_param - , param_set=list( - C=as.numeric(input$model_training_caret_models_svmLinear_advance_C) - ) + , param_set=list(C=as.numeric(input$model_training_caret_models_svmLinear_advance_C)) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$svmLinear_model = NULL } - ## svmPoly - if (isTRUE(input$model_training_caret_models_svmPoly_check)) { - if (isTRUE(!is.null(input$model_training_caret_models_svmPoly_advance_scale))) { - scale_ = input$model_training_caret_models_svmPoly_advance_scale - scale_ = seq(scale_[1], scale_[2], length.out=20) - } else { - scale_ = input$model_training_caret_models_svmPoly_advance_scale - } - rv_training_models$svmPoly_model = Rautoml::setup_caret( + if (!is.null(rv_training_models$svmPoly_name)) { + scale_ = input$model_training_caret_models_svmPoly_advance_scale + if (!is.null(scale_)) scale_ = seq(scale_[1], scale_[2], length.out=20) + rv_training_models$svmPoly_model = Rautoml::setup_caret( rv_training_models$svmPoly_name , param=rv_training_models$svmPoly_param , param_set=list( degree=as.numeric(input$model_training_caret_models_svmPoly_advance_degree) - , C = as.numeric(input$model_training_caret_models_svmPoly_advance_C) + , C=as.numeric(input$model_training_caret_models_svmPoly_advance_C) , scale=scale_ ) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$svmPoly_model = NULL } - ## glmnet - if (isTRUE(input$model_training_caret_models_glmnet_check)) { - rv_training_models$glmnet_model = Rautoml::setup_caret( + if (!is.null(rv_training_models$glmnet_name)) { + rv_training_models$glmnet_model = Rautoml::setup_caret( rv_training_models$glmnet_name , param=rv_training_models$glmnet_param , param_set=list( alpha=as.numeric(input$model_training_caret_models_glmnet_advance_alpha) - , lambda = c(seq(0.001, 0.1, length.out=10), seq(0.1, 2, by =0.1) , seq(2, 5, 0.5) , seq(5, 25, 1)) + , lambda=c(seq(0.001,0.1,length.out=10),seq(0.1,2,by=0.1),seq(2,5,0.5),seq(5,25,1)) ) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$glmnet_model = NULL } - ## lasso - if (isTRUE(input$model_training_caret_models_lasso_check)) { + if (!is.null(rv_training_models$lasso_name)) { rv_training_models$lasso_param = TRUE - rv_training_models$lasso_model = Rautoml::setup_caret( + rv_training_models$lasso_model = Rautoml::setup_caret( rv_training_models$lasso_name - , param=TRUE#rv_training_models$lasso_param + , param=TRUE , param_set=list( alpha=as.numeric(input$model_training_caret_models_lasso_advance_alpha) - , lambda = c(seq(0.001, 0.1, length.out=10), seq(0.1, 2, by =0.1) , seq(2, 5, 0.5) , seq(5, 25, 1)) + , lambda=c(seq(0.001,0.1,length.out=10),seq(0.1,2,by=0.1),seq(2,5,0.5),seq(5,25,1)) ) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$lasso_model = NULL } - ## ridge - if (isTRUE(input$model_training_caret_models_ridge_check)) { + if (!is.null(rv_training_models$ridge_name)) { rv_training_models$ridge_param = TRUE - rv_training_models$ridge_model = Rautoml::setup_caret( + rv_training_models$ridge_model = Rautoml::setup_caret( rv_training_models$ridge_name - , param=TRUE#rv_training_models$ridge_param + , param=TRUE , param_set=list( alpha=as.numeric(input$model_training_caret_models_ridge_advance_alpha) - , lambda = c(seq(0.001, 0.1, length.out=10), seq(0.1, 2, by =0.1) , seq(2, 5, 0.5) , seq(5, 25, 1)) + , lambda=c(seq(0.001,0.1,length.out=10),seq(0.1,2,by=0.1),seq(2,5,0.5),seq(5,25,1)) ) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$ridge_model = NULL } - ## knn - if (isTRUE(input$model_training_caret_models_knn_check)) { - rv_training_models$knn_model = Rautoml::setup_caret( + if (!is.null(rv_training_models$knn_name)) { + rv_training_models$knn_model = Rautoml::setup_caret( rv_training_models$knn_name , param=rv_training_models$knn_param - , param_set=list( - k=as.numeric(input$model_training_caret_models_knn_advance_k) - ) + , param_set=list(k=as.numeric(input$model_training_caret_models_knn_advance_k)) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$knn_model = NULL } - ## nnet - if (isTRUE(input$model_training_caret_models_nnet_check)) { - rv_training_models$nnet_model = Rautoml::setup_caret( + if (!is.null(rv_training_models$nnet_name)) { + rv_training_models$nnet_model = Rautoml::setup_caret( rv_training_models$nnet_name , param=rv_training_models$nnet_param , param_set=list( @@ -462,123 +415,73 @@ model_training_caret_train_all_server = function() { , decay=as.numeric(input$model_training_caret_models_nnet_advance_decay) ) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$nnet_model = NULL } - ## treebag - if (isTRUE(input$model_training_caret_models_treebag_check)) { + if (!is.null(rv_training_models$treebag_name)) { rv_training_models$treebag_trained_model = rv_training_models$treebag_name - rv_training_models$treebag_model = Rautoml::setup_caret( - rv_training_models$treebag_name - , param=FALSE - , param_set=NULL - ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$treebag_model = NULL + rv_training_models$treebag_model = Rautoml::setup_caret(rv_training_models$treebag_name, param=FALSE, param_set=NULL) } ## avNNet - if (isTRUE(input$model_training_caret_models_avNNet_check)) { - rv_training_models$avNNet_model = Rautoml::setup_caret( + if (!is.null(rv_training_models$avNNet_name)) { + rv_training_models$avNNet_model = Rautoml::setup_caret( rv_training_models$avNNet_name , param=rv_training_models$avNNet_param , param_set=list( - bag = input$model_training_caret_models_avNNet_advance_bag + bag=input$model_training_caret_models_avNNet_advance_bag , size=as.numeric(input$model_training_caret_models_avNNet_advance_size) , decay=as.numeric(input$model_training_caret_models_avNNet_advance_decay) ) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$avNNet_model = NULL } ## pls - if (isTRUE(input$model_training_caret_models_pls_check)) { - rv_training_models$pls_model = Rautoml::setup_caret( + if (!is.null(rv_training_models$pls_name)) { + rv_training_models$pls_model = Rautoml::setup_caret( rv_training_models$pls_name , param=rv_training_models$pls_param - , param_set=list( - ncomp=as.numeric(input$model_training_caret_models_pls_advance_ncomp) - ) + , param_set=list(ncomp=as.numeric(input$model_training_caret_models_pls_advance_ncomp)) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$pls_model = NULL } - ## gam - if (isTRUE(input$model_training_caret_models_gam_check)) { + if (!is.null(rv_training_models$gam_name)) { rv_training_models$gam_trained_model = rv_training_models$gam_name - rv_training_models$gam_model = Rautoml::setup_caret( - rv_training_models$gam_name - , param=FALSE - , param_set=NULL - ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$gam_model = NULL + rv_training_models$gam_model = Rautoml::setup_caret(rv_training_models$gam_name, param=FALSE, param_set=NULL) } ## rpart - if (isTRUE(input$model_training_caret_models_rpart_check)) { + if (!is.null(rv_training_models$rpart_name)) { cp_ = input$model_training_caret_models_rpart_advance_cp - if (!is.null(cp_)) { - cp_ = runif(cp_, n=20) - } - rv_training_models$rpart_model = Rautoml::setup_caret( + if (!is.null(cp_)) cp_ = runif(cp_, n=20) + rv_training_models$rpart_model = Rautoml::setup_caret( rv_training_models$rpart_name , param=rv_training_models$rpart_param - , param_set=list( - cp=cp_ - ) + , param_set=list(cp=cp_) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$rpart_model = NULL } - + ## mlpWeightDecayML - if (isTRUE(input$model_training_caret_models_mlpWeightDecayML_check)) { + if (!is.null(rv_training_models$mlpWeightDecayML_name)) { layer1_ = input$model_training_caret_models_mlpWeightDecayML_advance_layer1 - if (!is.null(layer1_)) { - layer1_ = floor(runif(layer1_, n=20)) - } + if (!is.null(layer1_)) layer1_ = floor(runif(layer1_, n=20)) layer2_ = input$model_training_caret_models_mlpWeightDecayML_advance_layer2 - if (!is.null(layer2_)) { - layer2_ = floor(runif(layer2_, n=20)) - } + if (!is.null(layer2_)) layer2_ = floor(runif(layer2_, n=20)) layer3_ = input$model_training_caret_models_mlpWeightDecayML_advance_layer3 - if (!is.null(layer3_)) { - layer3_ = floor(runif(layer3_, n=20)) - } + if (!is.null(layer3_)) layer3_ = floor(runif(layer3_, n=20)) decay_ = input$model_training_caret_models_mlpWeightDecayML_advance_decay - if (!is.null(decay_)) { - decay_ = runif(decay_, n=20) - } - rv_training_models$mlpWeightDecayML_model = Rautoml::setup_caret( + if (!is.null(decay_)) decay_ = runif(decay_, n=20) + rv_training_models$mlpWeightDecayML_model = Rautoml::setup_caret( rv_training_models$mlpWeightDecayML_name , param=rv_training_models$mlpWeightDecayML_param - , param_set=list( - layer1=layer1_ - , layer2=layer2_ - , layer3=layer3_ - , decay = decay_ - ) + , param_set=list(layer1=layer1_, layer2=layer2_, layer3=layer3_, decay=decay_) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$mlpWeightDecayML_model = NULL } ## naive_bayes - if (isTRUE(input$model_training_caret_models_naive_bayes_check)) { + if (!is.null(rv_training_models$naive_bayes_name)) { laplace_ = input$model_training_caret_models_naive_bayes_advance_laplace if (!is.null(laplace_)) { laplace_ = runif(laplace_, n=20) @@ -588,34 +491,20 @@ model_training_caret_train_all_server = function() { adjust_ = runif(adjust_, n=20) } usekernel_ = input$model_training_caret_models_naive_bayes_advance_usekernel - rv_training_models$naive_bayes_model = Rautoml::setup_caret( + rv_training_models$naive_bayes_model = Rautoml::setup_caret( rv_training_models$naive_bayes_name , param=rv_training_models$naive_bayes_param - , param_set=list( - laplace=laplace_ - , adjust=adjust_ - , usekernel=usekernel_ - ) + , param_set=list(laplace=laplace_, adjust=adjust_, usekernel=usekernel_) ) - rv_ml_ai$at_least_one_model = TRUE - } else { - rv_training_models$naive_bayes_model = NULL } - ## Track models for PB rv_training_models$CARET_MODEL_IDS = gsub("_model$", "", grep("(? Date: Sun, 5 Jul 2026 19:34:49 +0300 Subject: [PATCH 06/11] Fix docker modal blank screen --- server.R | 29 +++++++++++++++----- server/location_modal.R | 36 +++++++++++++++++++----- ui.R | 53 ++++++++++++++++++++++++++++-------- ui/mod_quant_anonymization.R | 3 +- 4 files changed, 94 insertions(+), 27 deletions(-) diff --git a/server.R b/server.R index 7833ecd..425b48f 100644 --- a/server.R +++ b/server.R @@ -19,9 +19,11 @@ function(input, output, session){ source("server/homepage_translation_labels.R", local = TRUE) register_homepage_labels(output, session, get_rv_labels) - USER = user_auth(input, output, session) - - authed_started = reactiveVal(FALSE) + USER = user_auth(input, output, session) + login_logged_in_output_id <- paste0(app_login_config$APP_ID, "-logged_in") + outputOptions(output, login_logged_in_output_id, suspendWhenHidden = FALSE) + + authed_started = reactiveVal(FALSE) observeEvent(USER$logged_in, { req(isTRUE(USER$logged_in)) @@ -30,7 +32,10 @@ function(input, output, session){ color = "#FFF" ) - if (authed_started()) return() + if (authed_started()) { + waiter::waiter_hide() + return() + } authed_started(TRUE) app_username = USER$username @@ -923,9 +928,19 @@ function(input, output, session){ source("server/admin_server.R", local = TRUE) admin_server(USER) - update_progress("Ready!") - waiter::waiter_hide() - }, ignoreInit = FALSE) + update_progress("Ready!") + waiter::waiter_hide() + + ## After the waiter hides, force the active sidebar tab to re-trigger. + ## This un-suspends outputs inside the active tab that may have been + ## suspended during the waiter overlay. + shinyjs::runjs(" + setTimeout(function() { + var active = $('ul.sidebar-menu li.active > a').first(); + if (active.length) { active.trigger('click'); } + }, 400); + ") + }, ignoreInit = FALSE) waiter::waiter_hide() diff --git a/server/location_modal.R b/server/location_modal.R index e2fb5b4..d260ca6 100644 --- a/server/location_modal.R +++ b/server/location_modal.R @@ -32,7 +32,13 @@ location_modal_server <- function(USER) { params = list(USER$username)) DBI::dbDisconnect(con) country_set <- nrow(row) > 0 && !is.na(row$country[1]) && nzchar(trimws(row$country[1])) - if (!country_set) showModal(country_modal_ui()) + if (!country_set) { + modal_ui <- country_modal_ui() + session$onFlushed(function() { + waiter::waiter_hide() + showModal(modal_ui) + }, once = TRUE) + } }) # Save country on submit @@ -40,12 +46,28 @@ location_modal_server <- function(USER) { req(isTRUE(USER$logged_in)) chosen <- input$user_country if (is.null(chosen) || !nzchar(chosen) || chosen == "--- Select ---") return() - con <- DBI::dbConnect(RSQLite::SQLite(), 'users_db/users.sqlite') - DBI::dbExecute(con, - "UPDATE users SET country = ? WHERE username = ?", - params = list(chosen, USER$username)) - DBI::dbDisconnect(con) - removeModal() + tryCatch({ + con <- DBI::dbConnect(RSQLite::SQLite(), 'users_db/users.sqlite') + on.exit(DBI::dbDisconnect(con), add = TRUE) + rows <- DBI::dbExecute(con, + "UPDATE users SET country = ? WHERE username = ?", + params = list(chosen, USER$username)) + message(sprintf("Country saved for user '%s': %s (%s row(s) updated)", USER$username, chosen, rows)) + removeModal() + shinyjs::runjs(" + setTimeout(function() { + if (window.waiter && typeof window.waiter.hide === 'function') { + window.waiter.hide(null); + } + $('.waiter-overlay').remove(); + $('.modal-backdrop').remove(); + $('body').removeClass('modal-open').css('padding-right', ''); + }, 250); + ") + }, error = function(e) { + message(sprintf("Country save failed for user '%s': %s", USER$username, conditionMessage(e))) + shinyalert::shinyalert("Error", paste0(get_rv_labels("general_error_alert"), "\n", conditionMessage(e)), type = "error") + }) }) # Log page visits using the sidebar tab input (server-side, no JS needed) diff --git a/ui.R b/ui.R index 5e99a25..4dce6ec 100644 --- a/ui.R +++ b/ui.R @@ -16,10 +16,11 @@ source(paste0(getwd(), "/ui/tooltip.R")) # Load UI function before deploy_model_ui() source("ui/deploy_model_ui.R") -#Load Headertag -source(paste0(getwd(), "/ui/login_credentials.R")) - -source(paste0(getwd(), "/ui/headertag.R")) +#Load Headertag +source(paste0(getwd(), "/ui/login_credentials.R")) +login_logged_in_output_id <- paste0(app_login_config$APP_ID, "-logged_in") + +source(paste0(getwd(), "/ui/headertag.R")) #Load App Theme source(paste0(getwd(), "/ui/appTheme.R")) #Load Header @@ -43,12 +44,43 @@ fluidPage( useShinyjs(), useWaiter(), - waiterShowOnLoad( - color = "#FFF", - html = spin_loaders(id = 2, style="width:56px;height:56px;color:#7BC148;"), - logo= "WWW/aphrc.png"), - - shiny::tags$head( + waiterShowOnLoad( + color = "#FFF", + html = spin_loaders(id = 2, style="width:56px;height:56px;color:#7BC148;"), + logo= "WWW/aphrc.png"), + + tags$script(HTML(sprintf(" + (function() { + var loggedInOutputId = %s; + + function clearNocodeWaiter() { + try { + if (window.waiter && typeof window.waiter.hide === 'function') { + window.waiter.hide(null); + } + } catch (e) {} + if (window.jQuery) { + $('.waiter-overlay').remove(); + } + } + + document.addEventListener('DOMContentLoaded', function() { + setTimeout(clearNocodeWaiter, 15000); + }); + + $(document).on('shiny:connected', function() { + setTimeout(clearNocodeWaiter, 3000); + }); + + $(document).on('shiny:value', function(event) { + if (event.name === loggedInOutputId) { + setTimeout(clearNocodeWaiter, 250); + } + }); + })(); + ", jsonlite::toJSON(login_logged_in_output_id, auto_unbox = TRUE)))), + + shiny::tags$head( tags$link( rel = "stylesheet", type = "text/css", @@ -106,4 +138,3 @@ fluidPage( div(footer) ) )) - \ No newline at end of file diff --git a/ui/mod_quant_anonymization.R b/ui/mod_quant_anonymization.R index f6d1fce..f3a4765 100644 --- a/ui/mod_quant_anonymization.R +++ b/ui/mod_quant_anonymization.R @@ -345,7 +345,7 @@ mod_quant_anon_ui <- function(id) { shinyAce::aceEditor( outputId = ns_stata_ace, - mode = "stata", + mode = "plain_text", theme = "chrome", readOnly = TRUE, height = "400px" @@ -391,4 +391,3 @@ mod_quant_anon_ui <- function(id) { ) ) } - From 589a72579f348c58c6150d6307f82dd8b70fc69f Mon Sep 17 00:00:00 2001 From: damiancodes Date: Sun, 5 Jul 2026 20:09:14 +0300 Subject: [PATCH 07/11] Fix loading flash --- server.R | 314 ++++++++++++++++++++++------------------ server/location_modal.R | 14 +- ui.R | 32 ---- 3 files changed, 182 insertions(+), 178 deletions(-) diff --git a/server.R b/server.R index 425b48f..2c7b3df 100644 --- a/server.R +++ b/server.R @@ -13,17 +13,57 @@ function(input, output, session){ color = "#FFF" ) } + ## Reveal the app only once Shiny has actually finished rendering outputs + ## (content-ready), instead of guessing with a fixed delay. This removes the + ## brief "skeleton" flash on refresh. A max-timeout fail-safe guarantees the + ## overlay is never left stuck (e.g. slow Docker cold start -> no white screen). + hide_waiter_after_paint <- function(extra_js = "", fallback_ms = 6000) { + shinyjs::runjs(sprintf(" + (function() { + var revealed = false, idleTimer = null; + var STABLE_MS = 200; // reveal after outputs stay idle this long + function reveal() { + if (revealed) return; + revealed = true; + if (idleTimer) clearTimeout(idleTimer); + $(document).off('shiny:idle', onIdle); + $(document).off('shiny:busy', onBusy); + if (window.waiter && typeof window.waiter.hide === 'function') { + window.waiter.hide(null); + } + $('.waiter-overlay').remove(); + %s + } + function onBusy() { + if (idleTimer) { clearTimeout(idleTimer); idleTimer = null; } + } + function onIdle() { + if (idleTimer) clearTimeout(idleTimer); + idleTimer = setTimeout(function() { requestAnimationFrame(reveal); }, STABLE_MS); + } + $(document).on('shiny:busy', onBusy); + $(document).on('shiny:idle', onIdle); + onIdle(); // handle the already-idle case + setTimeout(reveal, %d); // absolute fail-safe + })(); + ", extra_js, fallback_ms)) + } + hide_waiter_after_flush <- function(extra_js = "") { + session$onFlushed(function() { + hide_waiter_after_paint(extra_js) + }, once = TRUE) + } update_progress("Loading packages...") - + source("server/auth.R") source("server/homepage_translation_labels.R", local = TRUE) register_homepage_labels(output, session, get_rv_labels) - - USER = user_auth(input, output, session) - login_logged_in_output_id <- paste0(app_login_config$APP_ID, "-logged_in") - outputOptions(output, login_logged_in_output_id, suspendWhenHidden = FALSE) - - authed_started = reactiveVal(FALSE) + + USER = user_auth(input, output, session) + login_logged_in_output_id <- paste0(app_login_config$APP_ID, "-logged_in") + outputOptions(output, login_logged_in_output_id, suspendWhenHidden = FALSE) + + authed_started = reactiveVal(FALSE) observeEvent(USER$logged_in, { req(isTRUE(USER$logged_in)) @@ -32,14 +72,14 @@ function(input, output, session){ color = "#FFF" ) - if (authed_started()) { - waiter::waiter_hide() - return() - } + if (authed_started()) { + hide_waiter_after_flush() + return() + } authed_started(TRUE) app_username = USER$username - + model_training_caret_pb = Attendant$new("model_training_caret_pb", hide_on_max = TRUE) data_upload_id_pb = Attendant$new("data_upload_id_pb", hide_on_max = TRUE) model_metrics_caret_pb = Attendant$new("model_metrics_caret_pb", hide_on_max = TRUE) @@ -50,12 +90,12 @@ function(input, output, session){ generate_research_questions_additional_analysis_pb = Attendant$new("generate_research_questions_additional_analysis_pb", hide_on_max = TRUE) feature_engineering_perform_preprocess_pb = Attendant$new("feature_engineering_perform_preprocess_pb", hide_on_max = TRUE) model_training_caret_metrics_download_all_zip_pb = Attendant$new("model_training_caret_metrics_download_all_zip_pb", hide_on_max = TRUE) - + #### ---- Input validators --------------------------------------------------- source("server/input_validators.R") #### ---- Create needed folders for datasets and logs ------------------------ source("server/create_dirs.R", local=TRUE) - + #### ---- FastAPI base URL réactif (lié au champ fastapi_base) ---- source("R/utils_logging.R") @@ -67,12 +107,12 @@ function(input, output, session){ source("server/deploy_model_server.R", local=TRUE) source("ui/deploy_model_ui.R", local=TRUE) source("server/predict_pycaret_server.R", local = TRUE) - + source("server/history_actions.R", local = TRUE) source("server/history_transform_actions.R", local = TRUE) source("server/history_visualize_auto_actions.R", local = TRUE) source("server/history_visualize_custom_actions.R", local = TRUE) - + api_base <- reactive({ val <- input$fastapi_base if (is.null(val) || !nzchar(trimws(val))) { @@ -82,10 +122,10 @@ function(input, output, session){ } }) observe({ - + expand_label <- get_rv_labels("sidebar_toggle_expand_menu") collapse_label <- get_rv_labels("sidebar_toggle_menu_aria") - + session$sendCustomMessage( type = "sidebarLabels", message = list( @@ -93,24 +133,24 @@ function(input, output, session){ collapse = collapse_label ) ) - + }) - + # Send sidebar toggle labels to JS (reactive-safe) sent_sidebar_labels <- reactiveVal(FALSE) - + observe({ - req(rv_lang$labelling_file_df) - req(!sent_sidebar_labels()) - + req(rv_lang$labelling_file_df) + req(!sent_sidebar_labels()) + expand_label <- get_rv_labels("sidebar_toggle_expand_menu") collapse_label <- get_rv_labels("sidebar_toggle_menu_aria") - + session$sendCustomMessage( "sidebarLabels", list(expand = expand_label, collapse = collapse_label) ) - + sent_sidebar_labels(TRUE) }) @@ -149,21 +189,21 @@ function(input, output, session){ , outcome = NULL , vartype_all = NULL ) - + #####------------------Plots Reactive------------------- - + plots_custom_rv <- reactiveValues( plot_rv = NULL, tab_rv = NULL, plot_bivariate_auto = NULL, plot_corr = NULL ) - + plots_auto_rv <- reactiveValues( plot_bivariate_auto = NULL, plot_corr = NULL ) - + history_visualize_custom_actions_server( input = input, output = output, @@ -204,11 +244,11 @@ function(input, output, session){ ) ## --- - + rv_omop<- reactiveValues( url = NULL ) - - + + ## LLM/GAI rv_generative_ai = reactiveValues( history = NULL @@ -218,7 +258,7 @@ function(input, output, session){ rv_ml_ai = reactiveValues( session_id = NULL , seed_value = NULL - , dataset_id = NULL + , dataset_id = NULL , analysis_type = NULL , task = NULL , outcome = NULL @@ -241,7 +281,7 @@ function(input, output, session){ model_training_caret_models_ols_check = NULL , model_training_caret_models_ols_advance_control = NULL ) - + ## Train control caret rv_train_control_caret = reactiveValues( method = "cv" @@ -252,102 +292,102 @@ function(input, output, session){ , savePredictions = FALSE , classProbs = TRUE ) - + ## Trained models rv_training_models = reactiveValues( ols_model = NULL , ols_param = FALSE , ols_name = NULL , ols_trained_model = NULL - + , rf_model = NULL , rf_param = FALSE , rf_name = NULL , rf_trained_model = NULL - + , gbm_model = NULL , gbm_param = FALSE , gbm_name = NULL , gbm_trained_model = NULL - + , xgbTree_model = NULL , xgbTree_param = FALSE , xgbTree_name = NULL , xgbTree_trained_model = NULL - + , xgbLinear_model = NULL , xgbLinear_param = FALSE , xgbLinear_name = NULL , xgbLinear_trained_model = NULL - + , svmRadial_model = NULL , svmRadial_param = FALSE , svmRadial_name = NULL , svmRadial_trained_model = NULL - + , svmLinear_model = NULL , svmLinear_param = FALSE , svmLinear_name = NULL , svmLinear_trained_model = NULL - + , svmPoly_model = NULL , svmPoly_param = FALSE , svmPoly_name = NULL , svmPoly_trained_model = NULL - + , glmnet_model = NULL , glmnet_param = FALSE , glmnet_name = NULL , glmnet_trained_model = NULL - + , lasso_model = NULL , lasso_param = FALSE , lasso_name = NULL , lasso_trained_model = NULL - + , ridge_model = NULL , ridge_param = FALSE , ridge_name = NULL , ridge_trained_model = NULL - + , knn_model = NULL , knn_param = FALSE , knn_name = NULL , knn_trained_model = NULL - + , nnet_model = NULL , nnet_param = FALSE , nnet_name = NULL , nnet_trained_model = NULL - + , avNNet_model = NULL , avNNet_param = FALSE , avNNet_name = NULL , avNNet_trained_model = NULL - + , pls_model = NULL , pls_param = FALSE , pls_name = NULL , pls_trained_model = NULL - + , rpart_model = NULL , rpart_param = FALSE , rpart_name = NULL , rpart_trained_model = NULL - + , mlpWeightDecayML_model = NULL , mlpWeightDecayML_param = FALSE , mlpWeightDecayML_name = NULL , mlpWeightDecayML_trained_model = NULL - + , naive_bayes_model = NULL , naive_bayes_param = FALSE , naive_bayes_name = NULL , naive_bayes_trained_model = NULL - + , all_trained_models = NULL ) - + rv_training_results = reactiveValues( models = NULL , train_metrics_df = NULL @@ -440,7 +480,7 @@ function(input, output, session){ ## Deployed models rv_deployed_models = reactiveValues() - + ## Reactive values to stock AutoML leaderboard rv_automl <- reactiveValues( leaderboard = NULL @@ -450,20 +490,20 @@ function(input, output, session){ source("server/header_footer_configs.R", local=TRUE) app_title() - + ###-------App Footer-------------------------- - + footer_language_translation() ###-------Menu Translate--------- - + menu_translation() #### ---- Change language ---------------------------------------------------- output$change_language = change_language source("server/change_language_update.R", local = TRUE) - change_language_update() - + change_language_update() + # ---- Sidebar tooltip labels ---- nocode_tooltip_server( session = session, @@ -472,32 +512,32 @@ function(input, output, session){ #### ---- Upload data UI -------------------------------------------- source("ui/upload_data.R", local = TRUE) output$upload_type = upload_type - + #### ---- Upload dataset/files UI -------------------------------------------- source("server/input_files.R", local = TRUE) output$input_files = input_files - + #### ---- Show uploaded datasets UI -------------------------------------------- output$show_uploaded = show_uploaded - + #### ---- Data upload form ----------------------------------------------- source("ui/upload_form.R", local = TRUE) output$study_name = study_name output$study_country = study_country output$additional_info = additional_info output$submit_upload = submit_upload - + #### ---- Databse and API connection warning --------------------- db_api_con_future - + #### ---- Upload datasets ---------------------------------------- source("server/upload_data.R", local = TRUE) upload_data_server() - + #### ---- Database integration ---------------------------------------- source("server/database_integration.R", local = TRUE) database_integration_server() - + #### --- Database related form elements ---### output$db_type = db_type output$db_host = db_host @@ -513,19 +553,19 @@ function(input, output, session){ output$db_disconnect = db_disconnect output$db_tab_query = db_tab_query output$existing_connection = existing_connection - + source("server/omop_analysis.R", local = TRUE) omop_analysis_server() - + stderr_file_path <- file.path(getwd(), app_username, "output", "dq_stderr.txt") - + stderr_content<-create_log_reader(stderr_file_path) - + #### ---- Collect logs ---------------------------------------- source("server/collect_logs.R", local = TRUE) collect_logs_server() - + #### ---- Display uploaded datasets ---------------------------------------- source("server/display_uploaded_data.R", local = TRUE) display_uploaded_data_server() @@ -533,18 +573,18 @@ function(input, output, session){ #### ---- Delete uploaded dadatsets ---------------------------------------- source("server/delete_uploaded_data.R", local = TRUE) delete_uploaded_data_server() - + #### ---- Update logfiles based on existing datasets -------------------#### source("server/update_logs.R", local = TRUE) update_logs_server() - + #### ---- Manage data ---------------------------------------------- - + ##### ---- Select data --------------------------------------------- source("server/select_data.R", local = TRUE) select_data_server() manage_data_show_server() - + ##### ---- Display meta data for the selected dataset --------------------------------------------- source("server/display_metadata.R", local = TRUE) display_selected_metadata_server() @@ -563,7 +603,7 @@ function(input, output, session){ source("server/explore_data.R", local = TRUE) explore_data_server() explore_data_subactions_server() - + ##----User Defined Visualization section----------------------- source("ui/user_defined_visualization_header.R", local = TRUE) output$user_output_type = user_output_type @@ -573,14 +613,14 @@ function(input, output, session){ output$user_row_var = user_row_var output$usr_create_cross_tab = usr_create_cross_tab output$user_download_table = user_download_table - + output$user_table_options = user_table_options output$user_report_numeric = user_report_numeric output$user_add_p_value = user_add_p_value output$user_add_confidence_interval = user_add_confidence_interval output$user_drop_missing_values = user_drop_missing_values output$user_table_caption = user_table_caption - + output$user_plot_options = user_plot_options output$user_select_variable_on_x_axis = user_select_variable_on_x_axis output$user_select_variable_on_y_axis = user_select_variable_on_y_axis @@ -589,7 +629,7 @@ function(input, output, session){ output$user_y_axis_label = user_y_axis_label output$user_create = user_create output$user_download = user_download - + output$user_more_plot_options = user_more_plot_options output$user_transform_to_doughnut = user_transform_to_doughnut output$user_select_color_variable = user_select_color_variable @@ -599,7 +639,7 @@ function(input, output, session){ output$user_line_size = user_line_size output$user_select_line_type = user_select_line_type output$user_add_shapes = user_add_shapes - + output$user_select_shape = user_select_shape output$user_add_smooth = user_add_smooth output$user_display_confidence_interval = user_display_confidence_interval @@ -609,7 +649,7 @@ function(input, output, session){ output$user_add_points = user_add_points output$user_y_variable_summary_type = user_y_variable_summary_type output$user_title_position = user_title_position - + output$user_size_of_plot_title = user_size_of_plot_title output$user_axis_title_size = user_axis_title_size output$user_facet_title_size = user_facet_title_size @@ -623,10 +663,10 @@ function(input, output, session){ output$user_select_color_variable_single = user_select_color_variable_single output$user_select_color_parlet = user_select_color_parlet output$user_numeric_summary = user_numeric_summary - + output$bivariate_header_label = bivariate_header_label output$corrplot_header_label = corrplot_header_label - + output$user_select_bivariate_single_color = user_select_bivariate_single_color output$user_select_color_parlet_bivariate = user_select_color_parlet_bivariate output$user_select_color_parlet_corrplot = user_select_color_parlet_corrplot @@ -635,31 +675,31 @@ function(input, output, session){ output$user_download_autoreport = user_download_autoreport output$user_generatebivriate = user_generatebivriate - + ##### ---- Explore data actions ---------------------------------- explore_data_actions_server() - + ##### ---- Filter data -------------------------------------------- explore_data_filter_server() explore_data_apply_filter_server() explore_data_current_filter_server() - + ##### ---- Show/display ------------------------------------------------------- explore_show_data_server() explore_data_reset_current_filter_server() - + ##### ---- Compute proportion of missing data --------------------------- explore_missing_data_server() - + ##### ---- Select variables --------------------------------------------- explore_data_select_variables_server() explore_data_selected_variables_server() - + ##### ---- Update data ----------------------------------------------- explore_data_update_data_server() - + #### ---- Transform variables -------------------------------------- #### source("server/transform_data.R", local = TRUE) @@ -674,29 +714,29 @@ function(input, output, session){ ##### ---- Recode/change value labels ---------------------------------------### transform_data_quick_explore_recode_server() - + ##### ---- Handle missing data ---------------------------------------### transform_data_create_missing_values_server() - + ##### ---- Identify outliers ---------------------------------------### transform_data_identify_outliers_server() - + ##### ---- Handle missing values ---------------------------------------### transform_data_handle_missing_values_server() - + ##### ---- Plot transform data ----------------------------------------------### transform_data_quick_explore_plot_server() - + ##### ---- Plot missing data (LAZY-LOADED) --------------------------------### source("server/lazy_loaders.R", local = TRUE) lazy_load_missing_data() - + #### ---- Combine datasets with the existing one --------------------------------------#### source("server/combine_data.R", local = TRUE) - + ##### ---- List of internal data ------------------------------------------#### combine_data_list_datasets() - + ##### ---- Combine data options ------------------------------------------#### combine_data_type() @@ -705,7 +745,7 @@ function(input, output, session){ ##### ---- Combine data variables matched --------------------#### combine_data_variable_matching() - + #### ----- Perform matching ---------------------------------#### combine_data_perform_variable_match() @@ -731,20 +771,20 @@ function(input, output, session){ } ) ### ------- OMOP ------------------------------------------ ##### - + #### ----- Cohort Constructor ---------##### source("server/run_cohort_pipeline.R", local = TRUE) run_cohort_pipeline() - + #### ----- Feature Extraction ---------##### source("server/feature_extraction_pipeline.R", local = TRUE) feature_extraction_pipeline() - + #### ---- Achilles Integration -------------------#### - + source("server/run_achilles.R", local = TRUE) achilles_integration_server() - + ### ---- OMOP CDM Summaries---------------------------#### source("server/omop_summaries.R", local = TRUE) omopVizServer() @@ -756,7 +796,7 @@ function(input, output, session){ #### ---- Generate Research Questions --------------------------------------#### source("server/research_questions.R", local = TRUE) generate_research_questions_choices() - + ##### ---- API Token ------------------ #### generate_research_questions_api_token() @@ -769,34 +809,34 @@ function(input, output, session){ generate_research_questions_gemini() #### ---- Machine learning and AI --------------- #### - + ##### ----- Set ML/AI UI ------------------- #### update_progress("Loading ML modules...") source("server/setup_models.R", local=TRUE) setup_models_ui() - + ##### ----- Preprocessing ------------------- #### source("server/feature_engineering.R", local=TRUE) - + #### Preprocessing ------------------------------------------- #### feature_engineering_perform_preprocess_server() #### ------ Missing value imputation -------------------------- #### feature_engineering_recipe_server() feature_engineering_impute_missing_server() - + #### ----- Modelling framework --------------------------------- #### source("server/modelling_framework.R", local=TRUE) modelling_framework_choices() - + #### ----- Model setup ----------------------------------------- #### source("server/model_training_setup.R", local=TRUE) model_training_setup_server() #### ----- Caret models --------------------------------------- #### source("server/model_training_caret_models.R", local=TRUE) - + ## LM/GLM model_training_caret_models_ols_server() @@ -814,7 +854,7 @@ function(input, output, session){ ## svmRadial model_training_caret_models_svmRadial_server() - + ## svmLinear model_training_caret_models_svmLinear_server() @@ -823,7 +863,7 @@ function(input, output, session){ ## glmnet model_training_caret_models_glmnet_server() - + ## LASSO model_training_caret_models_lasso_server() @@ -853,10 +893,10 @@ function(input, output, session){ ## mlpWeightDecayML (MLP) model_training_caret_models_mlpWeightDecayML_server() - + ## Naive Bayes model_training_caret_models_naive_bayes_server() - + #### ----- Train all models ----------------------------------- #### source("server/train_caret_models.R", local=TRUE) model_training_caret_train_all_server() @@ -883,13 +923,13 @@ function(input, output, session){ predict_pycaret_server("predict_pycaret", api_base , rv_current, rv_ml_ai) # END NEW ADD - #### ---- Call current dataset for FastAPI --------------------------------------------------- + #### ---- Call current dataset for FastAPI --------------------------------------------------- source("server/automl_server.R", local=TRUE) automl_server("automl_module", rv_current, rv_ml_ai) observe({ req(!is.null(rv_ml_ai$modelling_framework)) # Check if value exist - + if (tolower(rv_ml_ai$modelling_framework) == "pycaret") { output$automl_module_ui <- renderUI({ automl_ui("automl_module") @@ -900,14 +940,14 @@ function(input, output, session){ }) } }) - + observeEvent(input$modelling_framework_choices, { rv_ml_ai$framework <- tolower(input$modelling_framework_choices %||% "") }, ignoreInit = FALSE) - + #### ---- Deep Learning Server (LAZY-LOADED) ----- ### lazy_load_deep_learning() - + #### ---- Reset various components --------------------------------------#### ## Various components come before this source("server/resets.R", local = TRUE) @@ -928,20 +968,20 @@ function(input, output, session){ source("server/admin_server.R", local = TRUE) admin_server(USER) - update_progress("Ready!") - waiter::waiter_hide() - - ## After the waiter hides, force the active sidebar tab to re-trigger. - ## This un-suspends outputs inside the active tab that may have been - ## suspended during the waiter overlay. - shinyjs::runjs(" - setTimeout(function() { - var active = $('ul.sidebar-menu li.active > a').first(); - if (active.length) { active.trigger('click'); } - }, 400); - ") - }, ignoreInit = FALSE) - - waiter::waiter_hide() + update_progress("Ready!") + + ## Hide the loader only after Shiny has flushed outputs and the browser + ## has painted them. This avoids a brief textless dashboard flash. + hide_waiter_after_flush(" + var active = $('ul.sidebar-menu li.active > a').first(); + if (active.length) { active.trigger('click'); } + ") + }, ignoreInit = FALSE) + + session$onFlushed(function() { + if (!isTRUE(isolate(USER$logged_in))) { + hide_waiter_after_paint() + } + }, once = TRUE) } diff --git a/server/location_modal.R b/server/location_modal.R index d260ca6..9a0ff7d 100644 --- a/server/location_modal.R +++ b/server/location_modal.R @@ -54,15 +54,11 @@ location_modal_server <- function(USER) { params = list(chosen, USER$username)) message(sprintf("Country saved for user '%s': %s (%s row(s) updated)", USER$username, chosen, rows)) removeModal() - shinyjs::runjs(" - setTimeout(function() { - if (window.waiter && typeof window.waiter.hide === 'function') { - window.waiter.hide(null); - } - $('.waiter-overlay').remove(); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open').css('padding-right', ''); - }, 250); + ## Reveal the dashboard using the same content-ready logic as login + ## (no hardcoded delay), plus modal-specific cleanup. + hide_waiter_after_paint(" + $('.modal-backdrop').remove(); + $('body').removeClass('modal-open').css('padding-right', ''); ") }, error = function(e) { message(sprintf("Country save failed for user '%s': %s", USER$username, conditionMessage(e))) diff --git a/ui.R b/ui.R index 4dce6ec..0f834e7 100644 --- a/ui.R +++ b/ui.R @@ -18,7 +18,6 @@ source(paste0(getwd(), "/ui/tooltip.R")) source("ui/deploy_model_ui.R") #Load Headertag source(paste0(getwd(), "/ui/login_credentials.R")) -login_logged_in_output_id <- paste0(app_login_config$APP_ID, "-logged_in") source(paste0(getwd(), "/ui/headertag.R")) #Load App Theme @@ -49,37 +48,6 @@ fluidPage( html = spin_loaders(id = 2, style="width:56px;height:56px;color:#7BC148;"), logo= "WWW/aphrc.png"), - tags$script(HTML(sprintf(" - (function() { - var loggedInOutputId = %s; - - function clearNocodeWaiter() { - try { - if (window.waiter && typeof window.waiter.hide === 'function') { - window.waiter.hide(null); - } - } catch (e) {} - if (window.jQuery) { - $('.waiter-overlay').remove(); - } - } - - document.addEventListener('DOMContentLoaded', function() { - setTimeout(clearNocodeWaiter, 15000); - }); - - $(document).on('shiny:connected', function() { - setTimeout(clearNocodeWaiter, 3000); - }); - - $(document).on('shiny:value', function(event) { - if (event.name === loggedInOutputId) { - setTimeout(clearNocodeWaiter, 250); - } - }); - })(); - ", jsonlite::toJSON(login_logged_in_output_id, auto_unbox = TRUE)))), - shiny::tags$head( tags$link( rel = "stylesheet", From e5d7cee7722a58a8d565d0ab98fa27f51f5eee68 Mon Sep 17 00:00:00 2001 From: damiancodes Date: Sun, 5 Jul 2026 20:56:12 +0300 Subject: [PATCH 08/11] Fix caret training --- server/train_caret_models.R | 43 +++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/server/train_caret_models.R b/server/train_caret_models.R index fbacf0a..6f8fa63 100644 --- a/server/train_caret_models.R +++ b/server/train_caret_models.R @@ -512,6 +512,25 @@ model_training_caret_train_all_server = function() { outputOptions(output, "model_training_caret_models_ui", suspendWhenHidden = FALSE) outputOptions(output, "model_training_apply", suspendWhenHidden = FALSE) + ## Instant client-side toggle for the Train button. The button is always + ## rendered (hidden) and shown the moment a model checkbox is ticked, with no + ## server round-trip -- so it feels instant on both RStudio and Docker. The + ## server flag rv_ml_ai$at_least_one_model is unchanged and still guards the + ## actual train action (Shiny processes the checkbox input before the click). + shinyjs::runjs(" + (function() { + var SEL = \"input[id^='model_training_caret_models_'][id$='_check']\"; + function refreshTrainBtn() { + var anyChecked = $(SEL).filter(':checked').length > 0; + $('#train_apply_wrap').css('display', anyChecked ? 'block' : 'none'); + } + $(document).on('change', SEL, refreshTrainBtn); + $(document).on('shiny:value', function(e) { + if (e.name === 'model_training_apply') { setTimeout(refreshTrainBtn, 0); } + }); + })(); + ") + ## After feature engineering fires, pre-warm all model checkbox/advance outputs ## so navigating to Train model does not trigger 40+ sequential round-trips. observeEvent(input$feature_engineering_apply, { @@ -556,18 +575,20 @@ model_training_caret_train_all_server = function() { output$model_training_apply = renderUI({ if (isTRUE(!is.null(rv_current$working_df))) { if (isTRUE(!is.null(rv_ml_ai$preprocessed))) { - if (isTRUE(rv_ml_ai$at_least_one_model)) { - button_label <- if (isTRUE(rv_training_results$training_busy) || isTRUE(rv_training_results$training_completed)) { - add_label <- tryCatch(as.character(get_rv_labels("caret_jobs_add_selected")), error = function(e) NULL) - if (is.null(add_label) || !length(add_label) || is.na(add_label[[1]]) || !nzchar(add_label[[1]])) { - "Add selected models to queue" - } else { - add_label[[1]] - } + button_label <- if (isTRUE(rv_training_results$training_busy) || isTRUE(rv_training_results$training_completed)) { + add_label <- tryCatch(as.character(get_rv_labels("caret_jobs_add_selected")), error = function(e) NULL) + if (is.null(add_label) || !length(add_label) || is.na(add_label[[1]]) || !nzchar(add_label[[1]])) { + "Add selected models to queue" } else { - get_rv_labels("model_training_apply") + add_label[[1]] } - p(br() + } else { + get_rv_labels("model_training_apply") + } + ## Always rendered but hidden; the client-side handler above shows it + ## instantly when a model checkbox is ticked (no server round-trip). + div(id = "train_apply_wrap", style = "display:none;" + , p(br() , actionBttn("model_training_apply" , inline=TRUE , block = FALSE @@ -575,7 +596,7 @@ model_training_caret_train_all_server = function() { , label = button_label ) ) - } + ) } } }) From f1061152abd83b2c4c9043e197400d8275e3f21d Mon Sep 17 00:00:00 2001 From: damiancodes Date: Mon, 6 Jul 2026 15:31:29 +0300 Subject: [PATCH 09/11] Fix numeric caret tuning parameters --- server/train_caret_models.R | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/train_caret_models.R b/server/train_caret_models.R index 0d37351..b6d81e4 100644 --- a/server/train_caret_models.R +++ b/server/train_caret_models.R @@ -11,6 +11,10 @@ model_training_caret_train_all_server = function() { if (is.atomic(value)) { value <- value[!is.na(value)] if (is.character(value)) value <- value[nzchar(value)] + if (is.character(value) && length(value)) { + numeric_value <- suppressWarnings(as.numeric(value)) + if (!anyNA(numeric_value)) value <- numeric_value + } } value } From b3047670468634546992c13615783f8bb274e8d3 Mon Sep 17 00:00:00 2001 From: damiancodes Date: Mon, 6 Jul 2026 17:46:41 +0300 Subject: [PATCH 10/11] Prewarm caret training context --- server/caret_job_manager.R | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/server/caret_job_manager.R b/server/caret_job_manager.R index 2c68349..e4e431d 100644 --- a/server/caret_job_manager.R +++ b/server/caret_job_manager.R @@ -282,7 +282,22 @@ caret_job_manager_server <- function( # Uses observeEvent so reactive reads inside the handler are automatically # isolated — avoids "no active reactive context" errors from nested reads. observeEvent( - list(rv_ml_ai$preprocessed, input$model_training_setup_eval_metric), + ## Prewarm on anything that changes the context signature, so the matching + ## context file is already on disk before the user clicks Train (turns the + ## ~5s on-click rebuild into an instant disk-cache hit). Same build logic + ## as before — only the set of things that (re)trigger it is wider. + list( + rv_ml_ai$preprocessed, + input$model_training_setup_eval_metric, + rv_ml_ai$seed_value, + rv_train_control_caret$method, + rv_train_control_caret$number, + rv_train_control_caret$repeats, + rv_train_control_caret$search, + rv_train_control_caret$classProbs, + rv_train_control_caret$savePredictions, + rv_train_control_caret$verboseIter + ), { req(!is.null(rv_ml_ai$preprocessed)) req(!is.null(input$model_training_setup_eval_metric)) From b264af32cd56d9e1d88a4d394f96d65533e2ecde Mon Sep 17 00:00:00 2001 From: damiancodes Date: Sat, 11 Jul 2026 13:28:24 +0300 Subject: [PATCH 11/11] Add async ensemble support --- server/caret_job_manager.R | 241 +++++++++++++++++++++++++- server/compare_trained_caret_models.R | 29 +++- static_files/labelling_file.xlsx | Bin 2277062 -> 2296426 bytes 3 files changed, 257 insertions(+), 13 deletions(-) diff --git a/server/caret_job_manager.R b/server/caret_job_manager.R index e4e431d..48c3d39 100644 --- a/server/caret_job_manager.R +++ b/server/caret_job_manager.R @@ -19,6 +19,8 @@ caret_job_manager_server <- function( context_cache <- reactiveVal(NULL) context_version <- reactiveVal(0L) context_cache_token <- digest::digest(paste(Sys.time(), runif(1)), algo = "xxhash64") + ensemble_request <- reactiveVal(NULL) + ensemble_build_scheduled <- reactiveVal(FALSE) label <- function(key, fallback) { value <- tryCatch(as.character(get_rv_labels(key)), error = function(e) NULL) @@ -28,6 +30,11 @@ caret_job_manager_server <- function( value[[1]] } + notify <- function(...) { + tryCatch(showNotification(..., session = session), error = function(e) NULL) + invisible(NULL) + } + empty_jobs <- function() { data.frame( job_id = character(), @@ -503,6 +510,214 @@ caret_job_manager_server <- function( invisible(NULL) } + maybe_build_ensemble <- function() { + request <- ensemble_request() + if (is.null(request)) return(invisible(NULL)) + + jobs <- get_jobs() + target_jobs <- jobs[jobs$job_id %in% request$job_ids, , drop = FALSE] + if (!NROW(target_jobs)) { + ensemble_request(NULL) + return(invisible(NULL)) + } + if (any(target_jobs$status %in% c("queued", "running", "paused"), na.rm = TRUE)) { + return(invisible(NULL)) + } + + if (is.null(rv_training_results$models) || length(rv_training_results$models) < 2L) { + notify( + label("caret_jobs_ensemble_need_two", "At least two completed models are required to build an ensemble."), + type = "warning", + duration = 8 + ) + ensemble_request(NULL) + return(invisible(NULL)) + } + + if (inherits(rv_training_results$models, "caretEnsemble")) { + ensemble_request(NULL) + return(invisible(NULL)) + } + + completed_job_ids <- target_jobs$job_id[target_jobs$status == "completed"] + completed_job_ids <- completed_job_ids[vapply( + completed_job_ids, + exists, + logical(1), + envir = job_results, + inherits = FALSE + )] + target_results <- if (length(completed_job_ids)) { + mget(completed_job_ids, envir = job_results, inherits = FALSE) + } else { + list() + } + target_models <- do.call(c, lapply(target_results, `[[`, "models")) + if (is.null(target_models) || length(target_models) < 2L) { + notify( + label("caret_jobs_ensemble_need_two", "At least two completed models are required to build an ensemble."), + type = "warning", + duration = 8 + ) + ensemble_request(NULL) + return(invisible(NULL)) + } + class(target_models) <- unique(c("caretList", class(target_models))) + + notify( + label("caret_jobs_ensemble_building", "Building ensemble from completed models..."), + type = "message", + duration = 5 + ) + + ensemble_models <- tryCatch({ + Rautoml::create_ensemble( + all.models = target_models, + ctrl = request$train_control, + metric = request$metric + ) + }, error = function(e) { + notify( + paste(label("caret_jobs_ensemble_failed", "Ensemble training failed:"), e$message), + type = "error", + duration = 10 + ) + return(NULL) + }) + + if (is.null(ensemble_models)) { + ensemble_request(NULL) + return(invisible(NULL)) + } + + rv_training_results$models <- ensemble_models + rv_training_models$ensemble_trained_model <- c(ensemble = "ensemble") + rv_training_models$all_trained_models <- c( + stats::setNames(names(target_models), gsub("\\.", " ", names(target_models))), + c(ensemble = "ensemble") + ) + + ensemble_test_df <- rv_ml_ai$preprocessed$test_df + name_map <- rv_training_results$model_safe_name_map + if (is.null(name_map) && length(target_results)) { + name_map <- target_results[[1]]$model_safe_name_map + } + if (!is.null(name_map) && is.data.frame(ensemble_test_df)) { + idx <- match(names(ensemble_test_df), name_map$original) + valid <- !is.na(idx) + names(ensemble_test_df)[valid] <- name_map$safe[idx[valid]] + } + + ensemble_train_metrics <- tryCatch({ + Rautoml::extract_summary( + ensemble_models, + summary_fun = Rautoml::student_t_summary + ) + }, error = function(e) NULL) + if (!is.null(ensemble_train_metrics) && NROW(ensemble_train_metrics)) { + ensemble_rows <- ensemble_train_metrics + if ("model" %in% names(ensemble_rows)) { + ensemble_rows <- ensemble_rows[tolower(as.character(ensemble_rows$model)) == "ensemble", , drop = FALSE] + } else if (!is.null(rownames(ensemble_rows))) { + ensemble_rows <- ensemble_rows[tolower(rownames(ensemble_rows)) == "ensemble", , drop = FALSE] + } + if (!NROW(ensemble_rows)) { + ensemble_rows <- ensemble_train_metrics + } + if (!is.null(rv_training_results$train_metrics_df) && NROW(rv_training_results$train_metrics_df)) { + ensemble_train_metrics <- rbind(rv_training_results$train_metrics_df, ensemble_rows) + } + class(ensemble_train_metrics) <- unique(c("Rautomlmetric", class(ensemble_train_metrics))) + rv_training_results$train_metrics_df <- ensemble_train_metrics + } + + ensemble_test_metrics <- tryCatch({ + Rautoml::boot_estimates_multiple( + models = ensemble_models, + df = ensemble_test_df, + outcome_var = rv_ml_ai$outcome, + problem_type = rv_ml_ai$task, + nreps = 100, + model_name = "ensemble", + type = "prob", + report = request$metric, + summary_fun = Rautoml::student_t_summary, + save_model = TRUE, + model_folder = file.path(app_username, "models"), + recipe_folder = file.path(app_username, "recipes"), + preprocesses = rv_ml_ai$preprocessed + ) + }, error = function(e) { + notify( + paste(label("caret_jobs_ensemble_metrics_failed", "Ensemble metrics failed:"), e$message), + type = "warning", + duration = 10 + ) + return(NULL) + }) + if (!is.null(ensemble_test_metrics) && NROW(ensemble_test_metrics$all)) { + current_test_metrics <- rv_training_results$test_metrics_objs + test_metrics <- list( + specifics = rbind(current_test_metrics$specifics, ensemble_test_metrics$specifics), + all = rbind(current_test_metrics$all, ensemble_test_metrics$all), + roc_df = rbind(current_test_metrics$roc_df, ensemble_test_metrics$roc_df), + positive_cat = current_test_metrics$positive_cat + ) + if (is.null(test_metrics$positive_cat)) { + test_metrics$positive_cat <- ensemble_test_metrics$positive_cat + } + class(test_metrics) <- c("Rautomlmetric2", "list") + rv_training_results$test_metrics_objs <- test_metrics + } + + ensemble_post_metrics <- tryCatch({ + Rautoml::post_model_metrics( + models = ensemble_models, + outcome = rv_ml_ai$outcome, + df = ensemble_test_df, + task = rv_ml_ai$task + ) + }, error = function(e) NULL) + if (!is.null(ensemble_post_metrics)) { + rv_training_results$post_model_metrics_objs <- ensemble_post_metrics + } + + notify( + label("caret_jobs_ensemble_ready", "Ensemble model is ready."), + type = "message", + duration = 5 + ) + ensemble_request(NULL) + ensemble_build_scheduled(FALSE) + invisible(TRUE) + } + + schedule_ensemble_build <- function() { + request <- ensemble_request() + if (is.null(request) || isTRUE(ensemble_build_scheduled())) return(invisible(NULL)) + + jobs <- get_jobs() + target_jobs <- jobs[jobs$job_id %in% request$job_ids, , drop = FALSE] + if (!NROW(target_jobs)) { + ensemble_request(NULL) + return(invisible(NULL)) + } + if (any(target_jobs$status %in% c("queued", "running", "paused"), na.rm = TRUE)) { + return(invisible(NULL)) + } + + ensemble_build_scheduled(TRUE) + session$onFlushed(function() { + later::later(function() { + isolate({ + ensemble_build_scheduled(FALSE) + maybe_build_ensemble() + }) + }, delay = 0.5) + }, once = TRUE) + invisible(TRUE) + } + poll_jobs <- function() { jobs <- get_jobs() if (!NROW(jobs)) return(invisible(NULL)) @@ -558,8 +773,11 @@ caret_job_manager_server <- function( } } - if (new_completion) merge_job_results() + if (new_completion) { + merge_job_results() + } start_queued_jobs() + schedule_ensemble_build() invisible(NULL) } @@ -569,9 +787,9 @@ caret_job_manager_server <- function( req(isTRUE(rv_ml_ai$at_least_one_model)) if (isTRUE(input$model_training_setup_include_ensemble_check)) { - showNotification( - label("caret_jobs_ensemble_deferred", "The async queue will train the selected base models now. Ensemble training needs a dependent background job and is not included in this run."), - type = "warning", + notify( + label("caret_jobs_ensemble_pending", "The async queue will train the selected base models first, then build the ensemble."), + type = "message", duration = 8 ) } @@ -611,7 +829,7 @@ caret_job_manager_server <- function( jobs <- selected_model_jobs(run_dir, skip_model_ids = active_model_ids) if (!length(jobs)) { - showNotification( + notify( label("caret_jobs_no_new_models", "The selected models are already in the training queue or results panel."), type = "message" ) @@ -621,7 +839,7 @@ caret_job_manager_server <- function( skipped_count <- sum(selected_input_ids %in% active_model_ids) if (skipped_count > 0) { - showNotification( + notify( label("caret_jobs_duplicate_skipped", "Some selected models were already in the queue and were not added again."), type = "message" ) @@ -656,6 +874,17 @@ caret_job_manager_server <- function( clear_model_selection(selected_input_ids) target_job_ids <- vapply(jobs, `[[`, character(1), "job_id") + if (isTRUE(input$model_training_setup_include_ensemble_check)) { + ensemble_request(list( + job_ids = target_job_ids, + train_control = train_control, + metric = input$model_training_setup_eval_metric + )) + } else { + ensemble_request(NULL) + ensemble_build_scheduled(FALSE) + } + session$onFlushed(function() { later::later(function() { isolate({ diff --git a/server/compare_trained_caret_models.R b/server/compare_trained_caret_models.R index c6cb1e5..1b38c0b 100644 --- a/server/compare_trained_caret_models.R +++ b/server/compare_trained_caret_models.R @@ -20,6 +20,21 @@ model_training_caret_train_metrics_server = function() { ## model completion → progress bar fires N times for N completed models. shap_apply_registered <- reactiveVal(FALSE) + clean_model_label <- function(model_names) { + vapply(model_names, function(model_name) { + display_name <- gsub("\\.", " ", model_name) + parts <- strsplit(display_name, "\\s+")[[1]] + if ( + length(parts) >= 3 && + parts[[1]] %in% rv_training_models$CARET_MODEL_IDS && + grepl("^[[:xdigit:]]{8}$", parts[[2]]) + ) { + return(paste(parts[-c(1, 2)], collapse = " ")) + } + display_name + }, character(1), USE.NAMES = FALSE) + } + # Fire only when results are available after training completes observeEvent(rv_training_results$train_metrics_df, { @@ -317,7 +332,7 @@ model_training_caret_train_metrics_server = function() { # Section header + ALL DOWNLOAD BUTTON model_section = list( - h3(model_name, style = "margin-top:30px; color:#2c3e50;"), + h3(clean_model_label(model_name), style = "margin-top:30px; color:#2c3e50;"), downloadBttn( paste0("download_all_", model_name), label = get_rv_labels("download_plots"), @@ -386,7 +401,7 @@ model_training_caret_train_metrics_server = function() { output[[down_id]] <- downloadHandler( filename = function() { - paste0(my_model, "_ALL_PLOTS_", Sys.Date(), ".zip") + paste0(clean_model_label(my_model), "_ALL_PLOTS_", Sys.Date(), ".zip") }, content = function(file) { @@ -401,7 +416,7 @@ model_training_caret_train_metrics_server = function() { p <- post_model_metrics_objs[[my_model]][[plot_name]] if (!is.null(p)) { - f <- paste0(my_model, "_", plot_name, ".png") + f <- paste0(clean_model_label(my_model), "_", plot_name, ".png") png(f, width = 1200, height = 900) print(p) dev.off() @@ -449,14 +464,14 @@ model_training_caret_train_metrics_server = function() { temp_models = names(rv_training_models$all_trained_models) ## FIXME: The names should align if (inherits(rv_training_results$models, "caretEnsemble")) { - temp_models = c(temp_models, "ensemble") - fixed_names = gsub("\\.", " ", temp_models) + model_values = c(gsub("\\.", " ", names(rv_training_results$models$models)), "ensemble") + temp_models = stats::setNames(model_values, clean_model_label(model_values)) } else { fixed_names = gsub("\\.", " ", names(rv_training_results$models)) + temp_models = temp_models[temp_models %in% fixed_names] } - temp_models = temp_models[temp_models %in% fixed_names] - temp_selected = temp_models + temp_selected = unname(temp_models) temp_labs = get_rv_labels("model_training_caret_test_metrics_trained_models_shap_ph") if (isTRUE(input$model_training_caret_more_options_shap_check=="Select models")) { empty_lab = "" diff --git a/static_files/labelling_file.xlsx b/static_files/labelling_file.xlsx index b5906411dc018c230a801e0fc466926d560f3747..7ae6cf1fa228f5dbcbe443f2d39ba25ca3aa6fad 100644 GIT binary patch literal 2296426 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