Skip to content

Commit d16bc5d

Browse files
Normalize beta parameter string aliases before calling downstream functions (#111)
* Initial plan * Normalize beta parameter string aliases to TRUE/FALSE before calling downstream functions Co-authored-by: smasongarrison <6001608+smasongarrison@users.noreply.github.com> * Fix inconsistencies in beta parameter validation and add support for all string aliases Co-authored-by: smasongarrison <6001608+smasongarrison@users.noreply.github.com> * Fix test for original alias to use proper seed and add test for index alias Co-authored-by: smasongarrison <6001608+smasongarrison@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: smasongarrison <6001608+smasongarrison@users.noreply.github.com>
1 parent 2ea088d commit d16bc5d

3 files changed

Lines changed: 92 additions & 14 deletions

File tree

R/simulatePedigree.R

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,20 @@ buildBetweenGenerations <- function(df_Fam, Ngen, sizeGens, verbose = FALSE, mar
2727
momID = "momID",
2828
dadID = "dadID",
2929
code_male = "M", code_female = "F", beta = FALSE) {
30-
if (beta == TRUE || beta %in% c("optimized", "index", "indexed")) {
30+
# Normalize string aliases to logical values for downstream functions
31+
use_optimized <- FALSE
32+
33+
if (beta %in% c("index", "indexed")) {
34+
stop("The 'index' or 'indexed' option for parameter 'beta' is not yet implemented.")
35+
} else if (isTRUE(beta) || identical(beta, "optimized")) {
36+
use_optimized <- TRUE
37+
} else if (isFALSE(beta) || beta %in% c("base", "original") || is.null(beta)) {
38+
use_optimized <- FALSE
39+
} else {
40+
stop("Invalid value for parameter 'beta'. Accepted values are TRUE, FALSE, 'optimized', 'base', 'original', or 'index'/'indexed'.")
41+
}
42+
43+
if (use_optimized) {
3144
df_Fam <- buildBetweenGenerations_optimized(
3245
df_Fam = df_Fam,
3346
Ngen = Ngen,
@@ -42,9 +55,9 @@ buildBetweenGenerations <- function(df_Fam, Ngen, sizeGens, verbose = FALSE, mar
4255
dadID = dadID,
4356
code_male = code_male,
4457
code_female = code_female,
45-
beta = beta
58+
beta = TRUE
4659
)
47-
} else if (beta == FALSE || beta %in% c("base", "original") || is.null(beta)) {
60+
} else {
4861
df_Fam <- buildBetweenGenerations_base(
4962
df_Fam = df_Fam,
5063
Ngen = Ngen,
@@ -59,10 +72,8 @@ buildBetweenGenerations <- function(df_Fam, Ngen, sizeGens, verbose = FALSE, mar
5972
dadID = dadID,
6073
code_male = code_male,
6174
code_female = code_female,
62-
beta = beta
75+
beta = FALSE
6376
)
64-
} else {
65-
stop("Invalid value for beta parameter. Use TRUE/'optimized' or FALSE/'base'.")
6677
}
6778
return(df_Fam)
6879
}

R/simulatePedigree_within.R

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,20 @@ buildWithinGenerations <- function(
1717
code_female = "F",
1818
fam_shift = 1L
1919
) {
20-
if (beta == TRUE || beta == "optimized") {
20+
# Normalize string aliases to logical values for downstream functions
21+
use_optimized <- FALSE
22+
23+
if (beta %in% c("index", "indexed")) {
24+
stop("The 'index' or 'indexed' option for parameter 'beta' is not yet implemented.")
25+
} else if (isTRUE(beta) || identical(beta, "optimized")) {
26+
use_optimized <- TRUE
27+
} else if (isFALSE(beta) || beta %in% c("base", "original") || is.null(beta)) {
28+
use_optimized <- FALSE
29+
} else {
30+
stop("Invalid value for parameter 'beta'. Accepted values are TRUE, FALSE, 'optimized', 'base', 'original', or 'index'/'indexed'.")
31+
}
32+
33+
if (use_optimized) {
2134
df_Fam <- buildWithinGenerations_optimized(
2235
sizeGens = sizeGens,
2336
marR = marR,
@@ -30,11 +43,9 @@ buildWithinGenerations <- function(
3043
code_male = code_male,
3144
code_female = code_female,
3245
fam_shift = fam_shift,
33-
beta = beta
46+
beta = TRUE
3447
)
35-
} else if (beta %in% c("index", "indexed")) {
36-
stop("The 'index' or 'indexed' option for parameter 'beta' is not yet implemented.")
37-
} else if (beta == FALSE || is.null(beta)) {
48+
} else {
3849
df_Fam <- buildWithinGenerations_base(
3950
sizeGens = sizeGens,
4051
marR = marR,
@@ -47,10 +58,8 @@ buildWithinGenerations <- function(
4758
code_male = code_male,
4859
code_female = code_female,
4960
fam_shift = fam_shift,
50-
beta = beta
61+
beta = FALSE
5162
)
52-
} else {
53-
stop("Invalid value for parameter 'beta'. Accepted values are TRUE, FALSE, 'optimized', or 'index'.")
5463
}
5564
return(df_Fam)
5665
}

tests/testthat/test-simulatePedigree.R

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,3 +165,61 @@ test_that("simulatePedigree verbose prints updates", {
165165
message("Beta option Ending: ", beta)
166166
}
167167
})
168+
169+
test_that("simulatePedigree accepts string aliases for beta parameter", {
170+
seed <- 5
171+
Ngen <- 4
172+
kpc <- 4
173+
sexR <- .50
174+
marR <- .7
175+
176+
# Test that "optimized" string alias works
177+
set.seed(seed)
178+
result_true <- simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = TRUE)
179+
180+
set.seed(seed)
181+
result_optimized <- simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "optimized")
182+
183+
# Results should be identical when using TRUE vs "optimized"
184+
expect_equal(nrow(result_true), nrow(result_optimized))
185+
expect_equal(ncol(result_true), ncol(result_optimized))
186+
expect_equal(result_true$ID, result_optimized$ID)
187+
188+
# Test that "base" string alias works
189+
set.seed(seed)
190+
result_false <- simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = FALSE)
191+
192+
set.seed(seed)
193+
result_base <- simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "base")
194+
195+
# Results should be identical when using FALSE vs "base"
196+
expect_equal(nrow(result_false), nrow(result_base))
197+
expect_equal(ncol(result_false), ncol(result_base))
198+
expect_equal(result_false$ID, result_base$ID)
199+
200+
# Test that "original" string alias works
201+
set.seed(seed)
202+
result_original <- simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "original")
203+
204+
# Results should be identical when using FALSE vs "original"
205+
expect_equal(nrow(result_false), nrow(result_original))
206+
expect_equal(ncol(result_false), ncol(result_original))
207+
expect_equal(result_false$ID, result_original$ID)
208+
209+
# Test that invalid beta values throw errors
210+
expect_error(
211+
simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "invalid"),
212+
"Invalid value for parameter"
213+
)
214+
215+
# Test that "index" and "indexed" both throw appropriate error
216+
expect_error(
217+
simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "index"),
218+
"not yet implemented"
219+
)
220+
221+
expect_error(
222+
simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "indexed"),
223+
"not yet implemented"
224+
)
225+
})

0 commit comments

Comments
 (0)