diff --git a/R/pipgd_pov.R b/R/pipgd_pov.R index fe034e9..c769638 100644 --- a/R/pipgd_pov.R +++ b/R/pipgd_pov.R @@ -29,6 +29,13 @@ pipgd_pov_headcount_nv <- check_pipgd_params(pl) po <- is_valid_inputs_pov(pl) + # Preserve the original lorenz if pipster_object exists and lorenz is not provided + original_lorenz <- if (is.null(lorenz) && !is.null(pipster_object) && !is.null(pipster_object$args$lorenz)) { + pipster_object$args$lorenz + } else { + lorenz + } + # __________________________________________________________________________ # params-------------------------------------------------------------------- if (po) { @@ -40,18 +47,20 @@ pipgd_pov_headcount_nv <- mean = mean, times_mean = times_mean, povshare = povshare, - lorenz = lorenz, + lorenz = original_lorenz, povline = povline) params <- pipster_object$params } # Lorenz---------------------------------------------------------------------- #_____________________________________________________________________________ - if (is.null(lorenz)) { - lorenz <- params$selected_lorenz$for_pov - } else { - match.arg(lorenz, c("lq", "lb")) - } + + lorenz <- choose_lorenz_for_pov(pipster_object, + params, + lorenz) + + # Headcount ------------------------------------------------------------------ + # ____________________________________________________________________________ headcount <- params$gd_params[[lorenz]]$validity$headcount @@ -210,11 +219,10 @@ pipgd_pov_gap_nv <- function(pipster_object = NULL, # Lorenz---------------------------------------------------------------------- #_____________________________________________________________________________ - if (is.null(lorenz)) { - lorenz <- params$selected_lorenz$for_pov - } else { - match.arg(lorenz, c("lq", "lb")) - } + + lorenz <- choose_lorenz_for_pov(pipster_object, + params, + lorenz) # povline--------------------------------------------------------------------- #_____________________________________________________________________________ @@ -405,13 +413,12 @@ pipgd_pov_severity_nv <- function( check_pipgd_params(pl) - # __________________________________________________________________________ - # Lorenz ------------------------------------------------------------------- - if (is.null(lorenz)) { - lorenz <- params$selected_lorenz$for_pov - } else { - match.arg(lorenz, c("lq", "lb")) - } + # Lorenz---------------------------------------------------------------------- + #_____________________________________________________________________________ + + lorenz <- choose_lorenz_for_pov(pipster_object, + params, + lorenz) # povline------------------------------------------------------------------- #___________________________________________________________________________ @@ -640,11 +647,10 @@ pipgd_watts_nv <- function( # Lorenz---------------------------------------------------------------------- #_____________________________________________________________________________ - if (is.null(lorenz)) { - lorenz <- params$selected_lorenz$for_pov - } else { - match.arg(lorenz, c("lq", "lb")) - } + + lorenz <- choose_lorenz_for_pov(pipster_object, + params, + lorenz) # povline--------------------------------------------------------------------- #_____________________________________________________________________________ @@ -797,7 +803,7 @@ pipgd_watts <- function( } - +# WRAPPERS ------- #' Validate group data parameters #' @@ -891,6 +897,23 @@ is_valid_inputs_pov <- function(pl) { } } +choose_lorenz_for_pov <- function(pipster_object = NULL, + params = NULL, + lorenz = NULL) { + if (!is.null(lorenz)) { + chosen_lorenz <- match.arg(lorenz, c("lq", "lb")) + } else { + # If lorenz is specified in pipster_object and not overridden by the function call, use it + if (!is.null(pipster_object$args$lorenz)) { + chosen_lorenz <- pipster_object$args$lorenz + } else { + # Use the selected lorenz if not specified in the function call or pipster_object + chosen_lorenz <- params$selected_lorenz$for_pov + } + } + + return(chosen_lorenz) +} diff --git a/tests/testthat/test-pipgd_pov.R b/tests/testthat/test-pipgd_pov.R index 4c0681c..25a80c4 100644 --- a/tests/testthat/test-pipgd_pov.R +++ b/tests/testthat/test-pipgd_pov.R @@ -237,8 +237,6 @@ test_that("pipgd_pov_headcount works as expected", { lorenz = "lq")$headcount)) }) -# Test poverty gap functions #### -# Test pipgd_pov_gap_nv (non vectorized function) #_______________________________________________________________________________ # POV GAP ---------------------------------------------------------------------- @@ -1246,3 +1244,168 @@ test_that("validate_params is equiv for all input types", { }) +#_______________________________________________________________________________ +# LORENZ CHECKS ----------------------------------------------------------------- +#_______________________________________________________________________________ +# Set-up + +pipster_object_with_lq <- create_pipster_object(welfare = pip_gd$L, + weight = pip_gd$P, + lorenz = 'lq') + +pipster_object_with_lb <- create_pipster_object(welfare = pip_gd$L, + weight = pip_gd$P, + lorenz = 'lb') + +pipster_object_without <- create_pipster_object(welfare = pip_gd$L, + weight = pip_gd$P) + +# Tests +## pipgd_headcount +test_that("pipgd_headcount uses right lorenz", { + + # unspecified + without <- pipgd_pov_headcount(pipster_object_without) + expect_equal(without$lorenz, + pipster_object_without$params$selected_lorenz$for_pov) + + with_lb <- pipgd_pov_headcount(pipster_object_with_lb) + expect_equal(with_lb$lorenz, + pipster_object_with_lb$args$lorenz) + + with_lq <- pipgd_pov_headcount(pipster_object_with_lq) + expect_equal(with_lq$lorenz, + pipster_object_with_lq$args$lorenz) + + # specified lb + without <- pipgd_pov_headcount(pipster_object_without, lorenz = 'lb') + expect_equal(without$lorenz, "lb") + + with_lb <- pipgd_pov_headcount(pipster_object_with_lb, lorenz = 'lb') + expect_equal(with_lb$lorenz, "lb") + + with_lq <- pipgd_pov_headcount(pipster_object_with_lq, lorenz = 'lb') + expect_equal(with_lq$lorenz, 'lb') + + # specified lq + without <- pipgd_pov_headcount(pipster_object_without, lorenz = 'lq') + expect_equal(without$lorenz, "lq") + + with_lb <- pipgd_pov_headcount(pipster_object_with_lb, lorenz = 'lq') + expect_equal(with_lb$lorenz, "lq") + + with_lq <- pipgd_pov_headcount(pipster_object_with_lq, lorenz = 'lq') + expect_equal(with_lq$lorenz, 'lq') + +}) + +## pipgd_pov_gap + +test_that("pipgd_pov_gap uses right lorenz", { + + # unspecified + without <- pipgd_pov_gap(pipster_object_without) + expect_equal(without$lorenz, + pipster_object_without$params$selected_lorenz$for_pov) + + with_lb <- pipgd_pov_gap(pipster_object_with_lb) + expect_equal(with_lb$lorenz, + pipster_object_with_lb$args$lorenz) + + with_lq <- pipgd_pov_gap(pipster_object_with_lq) + expect_equal(with_lq$lorenz, + pipster_object_with_lq$args$lorenz) + + # specified lb + without <- pipgd_pov_gap(pipster_object_without, lorenz = 'lb') + expect_equal(without$lorenz, "lb") + + with_lb <- pipgd_pov_gap(pipster_object_with_lb, lorenz = 'lb') + expect_equal(with_lb$lorenz, "lb") + + with_lq <- pipgd_pov_gap(pipster_object_with_lq, lorenz = 'lb') + expect_equal(with_lq$lorenz, 'lb') + + # specified lq + without <- pipgd_pov_gap(pipster_object_without, lorenz = 'lq') + expect_equal(without$lorenz, "lq") + + with_lb <- pipgd_pov_gap(pipster_object_with_lb, lorenz = 'lq') + expect_equal(with_lb$lorenz, "lq") + + with_lq <- pipgd_pov_gap(pipster_object_with_lq, lorenz = 'lq') + expect_equal(with_lq$lorenz, 'lq') + +}) + +## pipgd_pov_severity +test_that("pipgd_severity uses right lorenz", { + + # unspecified lorenz + without <- pipgd_pov_severity(pipster_object_without) + expect_equal(without$lorenz, pipster_object_without$params$selected_lorenz$for_pov) + + with_lb <- pipgd_pov_severity(pipster_object_with_lb) + expect_equal(with_lb$lorenz, pipster_object_with_lb$args$lorenz) + + with_lq <- pipgd_pov_severity(pipster_object_with_lq) + expect_equal(with_lq$lorenz, pipster_object_with_lq$args$lorenz) + + # specified lorenz as 'lb' + without <- pipgd_pov_severity(pipster_object_without, lorenz = 'lb') + expect_equal(without$lorenz, "lb") + + with_lb <- pipgd_pov_severity(pipster_object_with_lb, lorenz = 'lb') + expect_equal(with_lb$lorenz, "lb") + + with_lq <- pipgd_pov_severity(pipster_object_with_lq, lorenz = 'lb') + expect_equal(with_lq$lorenz, 'lb') + + # specified lorenz as 'lq' + without <- pipgd_pov_severity(pipster_object_without, lorenz = 'lq') + expect_equal(without$lorenz, "lq") + + with_lb <- pipgd_pov_severity(pipster_object_with_lb, lorenz = 'lq') + expect_equal(with_lb$lorenz, "lq") + + with_lq <- pipgd_pov_severity(pipster_object_with_lq, lorenz = 'lq') + expect_equal(with_lq$lorenz, 'lq') + +}) + + +## pipgd_watts +test_that("pipgd_watts uses right lorenz", { + + # unspecified lorenz + without <- pipgd_watts(pipster_object_without) + expect_equal(without$lorenz, pipster_object_without$params$selected_lorenz$for_pov) + + with_lb <- pipgd_watts(pipster_object_with_lb) + expect_equal(with_lb$lorenz, pipster_object_with_lb$args$lorenz) + + with_lq <- pipgd_watts(pipster_object_with_lq) + expect_equal(with_lq$lorenz, pipster_object_with_lq$args$lorenz) + + # specified lorenz as 'lb' + without <- pipgd_watts(pipster_object_without, lorenz = 'lb') + expect_equal(without$lorenz, "lb") + + with_lb <- pipgd_watts(pipster_object_with_lb, lorenz = 'lb') + expect_equal(with_lb$lorenz, "lb") + + with_lq <- pipgd_watts(pipster_object_with_lq, lorenz = 'lb') + expect_equal(with_lq$lorenz, 'lb') + + # specified lorenz as 'lq' + without <- pipgd_watts(pipster_object_without, lorenz = 'lq') + expect_equal(without$lorenz, "lq") + + with_lb <- pipgd_watts(pipster_object_with_lb, lorenz = 'lq') + expect_equal(with_lb$lorenz, "lq") + + with_lq <- pipgd_watts(pipster_object_with_lq, lorenz = 'lq') + expect_equal(with_lq$lorenz, 'lq') + +}) +