diff --git a/R/setFishing.R b/R/setFishing.R index 1d1b70bb..933443e5 100644 --- a/R/setFishing.R +++ b/R/setFishing.R @@ -402,6 +402,25 @@ check_gear_params <- function(x) { ". Did you perhaps mis-spell the names?") } + # Auto-populate missing argument columns for selectivity functions + if ("sel_func" %in% names(x)) { + funcs <- unique(x$sel_func) + funcs <- funcs[!is.na(funcs)] + for (sf in funcs) { + arg <- tryCatch({ + args <- names(formals(sf)) + args[!(args %in% c("w", "species_params", "..."))] + }, error = function(e) NULL) + if (length(arg) > 0) { + for (a in arg) { + if (!(a %in% names(x))) { + x[[a]] <- NA + } + } + } + } + } + # Validate parameters based on selectivity function if (nrow(x) > 0 && "sel_func" %in% names(x)) { for (i in seq_len(nrow(x))) { diff --git a/tests/testthat/test-calc-selectivity.R b/tests/testthat/test-calc-selectivity.R index 24d4a773..197bf2d0 100644 --- a/tests/testthat/test-calc-selectivity.R +++ b/tests/testthat/test-calc-selectivity.R @@ -37,7 +37,7 @@ test_that("calc_selectivity leaves unspecified gear-species combinations at zero test_that("calc_selectivity errors for missing or NA selectivity parameters", { params_missing <- knife_edge_selectivity_params_no_length - + class(params_missing@gear_params) <- "data.frame" params_missing@gear_params$knife_edge_size <- NULL expect_error(calc_selectivity(params_missing), "missing in the gear_params dataframe") diff --git a/tests/testthat/test-setFishing.R b/tests/testthat/test-setFishing.R index 3b4edc10..fd5cb1b8 100644 --- a/tests/testthat/test-setFishing.R +++ b/tests/testthat/test-setFishing.R @@ -415,3 +415,14 @@ test_that("gear_params reactive validation works", { df3 <- data.frame(species = "Sprat", gear = "g", sel_func = "knife_edge", knife_edge_size = -5) expect_warning(gp3 <- gear_params(df3), "knife_edge_size must be non-negative") }) + +test_that("gear_params selectivity column auto-population works", { + df <- data.frame(species = "Sprat", gear = "g") + gp <- gear_params(df) + + # Setting sel_func to sigmoid_length should add columns l25 and l50 + gp$sel_func <- "sigmoid_length" + expect_true(all(c("l25", "l50") %in% colnames(gp))) + expect_true(all(is.na(gp$l25))) + expect_true(all(is.na(gp$l50))) +})