diff --git a/R/graficar_predichos.R b/R/graficar_predichos.R index 9390ec7..49db0d2 100644 --- a/R/graficar_predichos.R +++ b/R/graficar_predichos.R @@ -72,19 +72,19 @@ graficar_predichos <- function(modelo, if (es_numerico) { warning("mostrar_letras = TRUE se ignora para predictores numéricos. Solo se admite para factores categóricos.", call. = FALSE) } else { - if (!requireNamespace("multcomp", quietly = TRUE)) { - stop("El paquete 'multcomp' es necesario para mostrar las letras de significancia. Instálelo con: install.packages('multcomp')", call. = FALSE) - } - - cld_df <- tryCatch({ - res <- multcomp::cld(emm, Letters = letters, alpha = alfa_letras, type = tipo_respuesta) - df_res <- as.data.frame(res) - df_res$.group <- gsub(" ", "", as.character(df_res$.group)) - df_res - }, error = function(e) { - warning("No se pudieron calcular las letras de significancia (CLD): ", e$message, call. = FALSE) + cld_df <- if (requireNamespace("multcomp", quietly = TRUE) && + requireNamespace("multcompView", quietly = TRUE)) { + tryCatch({ + res <- multcomp::cld(emm, Letters = letters, alpha = alfa_letras, type = tipo_respuesta) + df_res <- as.data.frame(res) + df_res$.group <- gsub(" ", "", as.character(df_res$.group)) + df_res + }, error = function(e) { + NULL + }) + } else { NULL - }) + } if (!is.null(cld_df)) { orig_levels <- levels(datos[[predictor]]) diff --git a/R/posthoc_emmeans.R b/R/posthoc_emmeans.R index 3f88ae2..4d591d5 100644 --- a/R/posthoc_emmeans.R +++ b/R/posthoc_emmeans.R @@ -93,21 +93,25 @@ obtener_posthoc <- function(modelo, # 3. Determinar el retorno basado en letras y graficos if (isTRUE(letras)) { - cld_res <- tryCatch({ - if (!requireNamespace("multcomp", quietly = TRUE)) { - cli::cli_abort("El paquete 'multcomp' es necesario para generar letras de significancia. Instálelo con: install.packages('multcomp')") - } - res <- multcomp::cld(emm, Letters = letters, alpha = 0.05, adjust = ajuste, type = tipo_respuesta) - df_res <- as.data.frame(res) - df_res$Grupo <- gsub(" ", "", as.character(df_res$.group)) - df_res$.group <- NULL - df_res - }, error = function(e) { - cli::cli_warn("No se pudieron calcular las letras de significancia (CLD): {e$message}") + cld_res <- if (requireNamespace("multcomp", quietly = TRUE) && + requireNamespace("multcompView", quietly = TRUE)) { + tryCatch({ + res <- multcomp::cld(emm, Letters = letters, alpha = 0.05, adjust = ajuste, type = tipo_respuesta) + df_res <- as.data.frame(res) + df_res$Grupo <- gsub(" ", "", as.character(df_res$.group)) + df_res$.group <- NULL + df_res + }, error = function(e) { + NULL + }) + } else { NULL - }) + } tabla_retorno <- if (!is.null(cld_res)) cld_res else as.data.frame(summary(emm, type = tipo_respuesta)) + if (!"Grupo" %in% names(tabla_retorno)) { + tabla_retorno$Grupo <- NA_character_ + } if (isTRUE(graficar)) { # Retornar grafico de predichos con letras diff --git a/tests/testthat/test-tablas-graficos.R b/tests/testthat/test-tablas-graficos.R index 41bb0cd..3aaa79c 100644 --- a/tests/testthat/test-tablas-graficos.R +++ b/tests/testthat/test-tablas-graficos.R @@ -26,3 +26,31 @@ test_that("Table exports and publication plotting work correctly", { p_int <- graficar_interaccion(m_int, factor_x = "Species", factor_traza = "Species", paleta = "viridis") expect_s3_class(p_int, "ggplot") }) + +test_that("Posthoc fallback keeps Grupo column when CLD dependencies are unavailable", { + m <- analizar_lm(iris, Sepal.Length ~ Species, diagnosticos = FALSE) + + local_mocked_bindings( + requireNamespace = function(package, quietly = TRUE) FALSE, + .env = environment(obtener_posthoc) + ) + + ph <- obtener_posthoc(m, "Species", letras = TRUE) + expect_s3_class(ph, "data.frame") + expect_true("Grupo" %in% names(ph)) + expect_true(all(is.na(ph$Grupo))) +}) + +test_that("graficar_predichos skips CLD gracefully when dependencies are unavailable", { + m <- analizar_lm(iris, Sepal.Length ~ Species, diagnosticos = FALSE) + + local_mocked_bindings( + requireNamespace = function(package, quietly = TRUE) FALSE, + .env = environment(graficar_predichos) + ) + + expect_no_warning( + p <- graficar_predichos(m, "Species", tipo_grafico = "barras", mostrar_letras = TRUE) + ) + expect_s3_class(p, "ggplot") +})