From f5bb0989dc407b5eaf71200b4592fb6bd9a7f490 Mon Sep 17 00:00:00 2001 From: Tony Wu Date: Thu, 20 Nov 2025 18:29:07 -0500 Subject: [PATCH 1/3] refactor(statmodel): Finalize namespaces for comparisons components --- R/module-statmodel-server.R | 38 +++++++++---------- ...contrasts.R => statmodel-ui-comparisons.R} | 3 +- 2 files changed, 20 insertions(+), 21 deletions(-) rename R/{statmodel-ui-options-contrasts.R => statmodel-ui-comparisons.R} (95%) diff --git a/R/module-statmodel-server.R b/R/module-statmodel-server.R index 7fd92fa..b2da6be 100644 --- a/R/module-statmodel-server.R +++ b/R/module-statmodel-server.R @@ -41,7 +41,7 @@ render_all_against_one_inputs = function(output, session, condition_list) { ns = session$ns output[[NAMESPACE_STATMODEL$comparisons_all_vs_one_choice]] = renderUI({ - selectInput(ns("group3"), "", condition_list()) + selectInput(ns(NAMESPACE_STATMODEL$comparisons_all_vs_one_choice), "", condition_list()) }) } @@ -49,24 +49,21 @@ render_custom_pairwise_inputs = function(output, session, condition_list) { ns = session$ns output[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1]] = renderUI({ - selectInput(ns("group1"), "Group 1", condition_list()) + selectInput(ns(NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1), "Group 1", condition_list()) }) output[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2]] = renderUI({ - selectInput(ns("group2"), "Group 2", condition_list()) + selectInput(ns(NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2), "Group 2", condition_list()) }) } render_custom_non_pairwise_inputs = function(output, session, condition_list) { ns = session$ns - - output[[NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_name]] = renderUI({ - textInput(ns("comp_name"), label = "Comparison Name", value = "") - }) - output[[NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights]] = renderUI({ lapply(1:length(condition_list()), function(i) { - list(numericInput(ns(paste0("weight", i)), + list(numericInput(ns(paste0( + NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, i) + ), label = condition_list()[i], value = 0)) }) }) @@ -77,11 +74,11 @@ render_custom_non_pairwise_inputs = function(output, session, condition_list) { validate_contrast_inputs = function(input, contrast_mode, condition_list) { if (contrast_mode == CONSTANTS_STATMODEL$comparison_mode_custom_pairwise) { validate( - need(input$group1 != input$group2, "Please select different groups") + need(input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1]] != input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2]], "Please select different groups") ) } else if (contrast_mode == CONSTANTS_STATMODEL$comparison_mode_custom_nonpairwise) { wt_sum = sum(sapply(1:length(condition_list), function(i) { - input[[paste0("weight", i)]] + input[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, i)]] })) validate( @@ -91,15 +88,15 @@ validate_contrast_inputs = function(input, contrast_mode, condition_list) { } build_custom_pairwise_contrast = function(input, condition_list, contrast, comp_list, row) { - if (input$group1 == input$group2) { + if (input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1]] == input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2]]) { return(contrast$matrix) } - index1 = which(condition_list == input$group1) - index2 = which(condition_list == input$group2) + index1 = which(condition_list == input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1]]) + index2 = which(condition_list == input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2]]) comp_list$dList = unique(c(isolate(comp_list$dList), - paste(input$group1, "vs", input$group2, sep = " "))) + paste(input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1]], "vs", input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2]], sep = " "))) contrast$row = matrix(row, nrow = 1) contrast$row[index1] = 1 @@ -120,18 +117,19 @@ build_custom_pairwise_contrast = function(input, condition_list, contrast, comp_ build_custom_non_pairwise_contrast = function(input, condition_list, contrast, comp_list, row) { wt_sum = sum(sapply(1:length(condition_list), function(i) { - input[[paste0("weight", i)]] + input[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, i)]] })) if (wt_sum != 0) { return(contrast$matrix) } - comp_list$dList = unique(c(isolate(comp_list$dList), input$comp_name)) + comp_list$dList = unique(c(isolate(comp_list$dList), + input[[NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_name]])) contrast$row = matrix(row, nrow = 1) for (index in 1:length(condition_list)) { - contrast$row[index] = input[[paste0("weight", index)]] + contrast$row[index] = input[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, index)]] } if (is.null(contrast$matrix)) { @@ -148,13 +146,13 @@ build_custom_non_pairwise_contrast = function(input, condition_list, contrast, c } build_all_against_one_contrast = function(input, condition_list, contrast, comp_list, row, loadpage_input) { - index3 = which(condition_list == input$group3) + index3 = which(condition_list == input[[NAMESPACE_STATMODEL$comparisons_all_vs_one_choice]]) for (index in 1:length(condition_list)) { if (index == index3) next comp_list$dList = c(isolate(comp_list$dList), - paste(condition_list[index], "vs", input$group3, sep = " ")) + paste(condition_list[index], "vs", input[[NAMESPACE_STATMODEL$comparisons_all_vs_one_choice]], sep = " ")) contrast$row = matrix(row, nrow = 1) contrast$row[index] = 1 diff --git a/R/statmodel-ui-options-contrasts.R b/R/statmodel-ui-comparisons.R similarity index 95% rename from R/statmodel-ui-options-contrasts.R rename to R/statmodel-ui-comparisons.R index 43364bf..0e37997 100644 --- a/R/statmodel-ui-options-contrasts.R +++ b/R/statmodel-ui-comparisons.R @@ -72,7 +72,8 @@ build_all_pairwise_panel <- function(ns) { build_custom_nonpairwise_panel <- function(ns) { tagList( h5("Non-pairwise Comparison:"), - uiOutput(ns(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_name)), + textInput(ns(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_name), + label = "Comparison Name", value = ""), uiOutput(ns(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights)), actionButton(ns(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_submit), "Add"), actionButton(ns(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_clear), "Clear matrix") From b7d164a85783eb52f602a4a6a7452d68a88d6c75 Mon Sep 17 00:00:00 2001 From: Tony Wu Date: Thu, 20 Nov 2025 18:39:51 -0500 Subject: [PATCH 2/3] fix one set of unit tests --- tests/testthat/test-utils-statmodel-server.R | 40 +++++++++++--------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/tests/testthat/test-utils-statmodel-server.R b/tests/testthat/test-utils-statmodel-server.R index b05c457..cb47fbe 100644 --- a/tests/testthat/test-utils-statmodel-server.R +++ b/tests/testthat/test-utils-statmodel-server.R @@ -59,7 +59,9 @@ test_that("get_experimental_conditions returns GROUP for standard analysis", { # ============================================================================ test_that("build_custom_pairwise_contrast creates correct matrix", { - input <- list(group1 = "A", group2 = "B") + input <- list() + input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1]] = "A" + input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2]] = "B" condition_list <- c("A", "B", "C") contrast <- list(matrix = NULL, row = NULL) comp_list <- list(dList = NULL) @@ -78,7 +80,9 @@ test_that("build_custom_pairwise_contrast creates correct matrix", { }) test_that("build_custom_pairwise_contrast handles multiple comparisons", { - input <- list(group1 = "C", group2 = "A") + input <- list() + input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1]] = "C" + input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2]] = "A" condition_list <- c("A", "B", "C") existing_matrix <- matrix(c(1, -1, 0), nrow = 1) rownames(existing_matrix) <- "A vs B" @@ -98,7 +102,9 @@ test_that("build_custom_pairwise_contrast handles multiple comparisons", { }) test_that("build_custom_pairwise_contrast returns unchanged matrix for same groups", { - input <- list(group1 = "A", group2 = "A") + input <- list() + input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1]] = "A" + input[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2]] = "A" condition_list <- c("A", "B", "C") existing_matrix <- matrix(c(1, -1, 0), nrow = 1) @@ -118,12 +124,11 @@ test_that("build_custom_pairwise_contrast returns unchanged matrix for same grou # ============================================================================ test_that("build_custom_non_pairwise_contrast creates correct matrix", { - input <- list( - weight1 = 0.5, - weight2 = 0.5, - weight3 = -1, - comp_name = "AB vs C" - ) + input <- list() + input[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, 1)]] = 0.5 + input[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, 2)]] = 0.5 + input[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, 3)]] = -1 + input[[NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_name]] = "AB vs C" condition_list <- c("A", "B", "C") contrast <- list(matrix = NULL, row = NULL) comp_list <- list(dList = NULL) @@ -141,12 +146,11 @@ test_that("build_custom_non_pairwise_contrast creates correct matrix", { }) test_that("build_custom_non_pairwise_contrast rejects non-zero sum", { - input <- list( - weight1 = 1, - weight2 = 1, - weight3 = 1, - comp_name = "Invalid" - ) + input <- list() + input[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, 1)]] = 1 + input[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, 2)]] = 1 + input[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, 3)]] = 1 + input[[NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_name]] = "invalid" condition_list <- c("A", "B", "C") existing_matrix <- matrix(c(1, -1, 0), nrow = 1) @@ -166,7 +170,8 @@ test_that("build_custom_non_pairwise_contrast rejects non-zero sum", { # ============================================================================ test_that("build_all_against_one_contrast creates all comparisons", { - input <- list(group3 = "Control") + input <- list() + input[[NAMESPACE_STATMODEL$comparisons_all_vs_one_choice]] = "Control" condition_list <- c("TreatA", "TreatB", "Control") contrast <- list(matrix = NULL, row = NULL) comp_list <- list(dList = NULL) @@ -187,7 +192,8 @@ test_that("build_all_against_one_contrast creates all comparisons", { }) test_that("build_all_against_one_contrast handles single comparison", { - input <- list(group3 = "B") + input <- list() + input[[NAMESPACE_STATMODEL$comparisons_all_vs_one_choice]] = "B" condition_list <- c("A", "B") contrast <- list(matrix = NULL, row = NULL) comp_list <- list(dList = NULL) From ca08aa106a102af7bb84161a154f3e6e709ed692 Mon Sep 17 00:00:00 2001 From: Tony Wu Date: Thu, 20 Nov 2025 18:45:41 -0500 Subject: [PATCH 3/3] finalize all unit tests --- tests/testthat/test-module-statmodel-server.R | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/testthat/test-module-statmodel-server.R b/tests/testthat/test-module-statmodel-server.R index d75f43b..49d3207 100644 --- a/tests/testthat/test-module-statmodel-server.R +++ b/tests/testthat/test-module-statmodel-server.R @@ -189,8 +189,8 @@ test_that("matrix_build creates correct pairwise comparison", { # Set up custom comparison inputs <- list() inputs[[NAMESPACE_STATMODEL$comparison_mode]] <- CONSTANTS_STATMODEL$comparison_mode_custom_pairwise - inputs$group1 <- "Group1" - inputs$group2 <- "Group2" + inputs[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1]] = "Group1" + inputs[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2]] = "Group2" inputs[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_submit]] <- 1 do.call(session$setInputs, inputs) @@ -280,7 +280,7 @@ test_that("matrix_build creates all vs one comparisons", { # Set up all vs one comparison inputs <- list() inputs[[NAMESPACE_STATMODEL$comparison_mode]] <- CONSTANTS_STATMODEL$comparison_mode_all_vs_one - inputs$group3 <- "Group3" + inputs[[NAMESPACE_STATMODEL$comparisons_all_vs_one_choice]] = "Group3" inputs[[NAMESPACE_STATMODEL$comparisons_all_vs_one_submit]] <- 1 do.call(session$setInputs, inputs) @@ -323,10 +323,10 @@ test_that("matrix_build creates custom non-pairwise comparison", { # Set up custom non-pairwise comparison inputs <- list() inputs[[NAMESPACE_STATMODEL$comparison_mode]] <- CONSTANTS_STATMODEL$comparison_mode_custom_nonpairwise - inputs$comp_name <- "CustomComparison" - inputs$weight1 <- 1 - inputs$weight2 <- 1 - inputs$weight3 <- -2 + inputs[[NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_name]] = "CustomComparison" + inputs[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, 1)]] = 1 + inputs[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, 2)]] = 1 + inputs[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, 3)]] = -2 inputs[[NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_submit]] <- 1 do.call(session$setInputs, inputs) @@ -374,8 +374,8 @@ test_that("check_cond validates same group selection", { # Set up invalid comparison (same groups) inputs <- list() inputs[[NAMESPACE_STATMODEL$comparison_mode]] <- CONSTANTS_STATMODEL$comparison_mode_custom_pairwise - inputs$group1 <- "Group1" - inputs$group2 <- "Group1" + inputs[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1]] = "Group1" + inputs[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2]] = "Group1" inputs[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_submit]] <- 1 do.call(session$setInputs, inputs) @@ -412,10 +412,10 @@ test_that("check_cond validates contrast weights sum to zero", { # Set up invalid weights (don't sum to 0) inputs <- list() inputs[[NAMESPACE_STATMODEL$comparison_mode]] <- CONSTANTS_STATMODEL$comparison_mode_custom_nonpairwise - inputs$comp_name <- "BadComparison" - inputs$weight1 <- 1 - inputs$weight2 <- 1 - inputs$weight3 <- 1 + inputs[[NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_name]] = "BadComparison" + inputs[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, 1)]] = 1 + inputs[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, 2)]] = 1 + inputs[[paste0(NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_weights, 3)]] = 1 inputs[[NAMESPACE_STATMODEL$comparisons_custom_nonpairwise_submit]] <- 1 do.call(session$setInputs, inputs) @@ -452,8 +452,8 @@ test_that("contrast_mode change resets matrix", { # Build a matrix inputs <- list() inputs[[NAMESPACE_STATMODEL$comparison_mode]] <- CONSTANTS_STATMODEL$comparison_mode_custom_pairwise - inputs$group1 <- "Group1" - inputs$group2 <- "Group2" + inputs[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1]] = "Group1" + inputs[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2]] = "Group2" inputs[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_submit]] <- 1 do.call(session$setInputs, inputs) matrix_build() @@ -497,8 +497,8 @@ test_that("matrix doesn't add duplicate rows", { # Add same comparison twice inputs <- list() inputs[[NAMESPACE_STATMODEL$comparison_mode]] <- CONSTANTS_STATMODEL$comparison_mode_custom_pairwise - inputs$group1 <- "Group1" - inputs$group2 <- "Group2" + inputs[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice1]] = "Group1" + inputs[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_choice2]] = "Group2" inputs[[NAMESPACE_STATMODEL$comparisons_custom_pairwise_submit]] <- 1 do.call(session$setInputs, inputs) matrix_build()