diff --git a/DESCRIPTION b/DESCRIPTION index 5ef7472d..6ac596c2 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -30,6 +30,7 @@ Depends: R (>= 4.1.0) Imports: data.table, + dirmult, glue, methods, mvnfast, @@ -61,7 +62,6 @@ Suggests: broom.helpers, survminer, katex, - dirmult, rms, lmerTest LinkingTo: diff --git a/NEWS.md b/NEWS.md index c865d381..6ff51f7b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,8 @@ # simstudy (development version) +* `clusterSize` now works after a standard installation: `dirmult` is a + required dependency rather than an optional suggestion (#257). + ## New feature * Added optional argument `withinClusterID` to `genCluster()` to generate diff --git a/R/generate_dist.R b/R/generate_dist.R index d7c938f1..24e1244b 100644 --- a/R/generate_dist.R +++ b/R/generate_dist.R @@ -655,14 +655,6 @@ .genclustsize <- function(n, formula, variance = 0, envir = parent.frame()) { - if (!requireNamespace("dirmult", quietly = TRUE)) { # nocov start - stop( - "Package \"dirmult\" must be installed to use this function with - the Poisson distribution.", - call. = FALSE - ) - } # nocov end - formula <- .evalWith(formula, .parseDotVars(formula, envir), envir = envir)[1] variance <- .evalWith(variance, .parseDotVars(variance, envir), envir = envir)[1] diff --git a/tests/testthat/test-generate_dist.R b/tests/testthat/test-generate_dist.R index 4fe1cb7e..e111b36f 100644 --- a/tests/testthat/test-generate_dist.R +++ b/tests/testthat/test-generate_dist.R @@ -177,6 +177,45 @@ test_that("clusterSize data is generated as expected.", { }) +test_that("genData preserves clusterSize totals for both dispersion branches", { + for (dispersion in c(0, 0.05)) { + def <- defData( + varname = "size", formula = 103, variance = dispersion, + dist = "clusterSize" + ) + dt <- genData(10, def) + + expect_length(dt$size, 10) + expect_true(all(dt$size >= 0)) + expect_equal(dt$size, floor(dt$size)) + expect_equal(sum(dt$size), 103) + if (dispersion == 0) { + expect_lte(diff(range(dt$size)), 1) + } + } +}) + +test_that("addColumns preserves clusterSize totals and existing identifiers", { + clusters <- genData(10) + + for (dispersion in c(0, 0.05)) { + def <- defDataAdd( + varname = "size", formula = 103, variance = dispersion, + dist = "clusterSize" + ) + dt <- addColumns(def, clusters) + + expect_identical(dt$id, clusters$id) + expect_length(dt$size, 10) + expect_true(all(dt$size >= 0)) + expect_equal(dt$size, floor(dt$size)) + expect_equal(sum(dt$size), 103) + if (dispersion == 0) { + expect_lte(diff(range(dt$size)), 1) + } + } +}) + # .gencustom ---- test_that("custom data is generated as expected.", { skip_on_cran()