From 98d1dc09eb603ad7927f4b100f396ff32a6c8a77 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Wed, 23 Oct 2024 23:54:49 -0300 Subject: [PATCH 01/26] Version 0.0.1.9001 Squashed commit of the following: commit b34c9abecc09085a9780f6b546a9f72e9584a7a8 Author: Mauro Loprete Date: Wed Oct 23 23:03:26 2024 -0300 Fix version commit 97c20fd033f253eec9b72f045a8b0bb260347ed9 Author: Mauro Loprete Date: Wed Oct 23 08:59:03 2024 -0300 Fix test class in recode to formula commit ed7dc025717188a135da1650aa7f01fe3fc34cc7 Author: Mauro Loprete Date: Wed Oct 23 01:25:21 2024 -0300 Fix NAMESPACE commit 91c5e6e5a2a41b1a4259acee562de685d7dd2336 Author: Mauro Loprete Date: Wed Oct 23 01:15:15 2024 -0300 Fix test commit dd6a14229606bfa2dac405a01ce0fd73728dc089 Merge: 43f4488 141b33c Author: Mauro Loprete Date: Wed Oct 23 01:12:52 2024 -0300 Merge branch 'develop' into feature/use_lazy_evaluation commit 141b33cf6b15c5afdf95ba0a19c7479213423dfc Author: Mauro Loprete Date: Wed Oct 23 01:12:02 2024 -0300 Fix pkgdown site commit 3dc687fc6163f5ba9567a03ef9b7be72bdd24a8d Author: Mauro Loprete Date: Wed Oct 23 00:59:44 2024 -0300 fix bake_Recipe.rd commit 8f7a6ed1de114854417cffd0dd23052ccc802a4d Author: Mauro Loprete Date: Wed Oct 23 00:59:44 2024 -0300 fix bake_Recipe.rd commit 43f4488c0a40ec19df4883050c07637c01c292a3 Author: Mauro Loprete Date: Wed Oct 23 00:59:44 2024 -0300 fix bake_Recipe.rd commit 350aa42259738a2eb13f7756809822a97060ef96 Merge: c67167f 92c75c2 Author: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Wed Oct 23 00:55:40 2024 -0300 Merge pull request #46 from metasurveyr/develop Lazy evaluation commit c67167f8bb81a8eded1c122b88141204601889b5 Merge: 56ad8cc e8c88fc Author: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Sun Oct 13 20:13:26 2024 -0300 Merge pull request #44 from metasurveyr/develop Fix test vignettes commit 56ad8ccf50d05abe1ef7ae2e9a5eea39a4344f6f Merge: bacca81 e84baa5 Author: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Sun Oct 13 11:31:51 2024 -0300 Merge pull request #42 from metasurveyr/develop Develop --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 7ea9116..56a6f19 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: metasurvey Title: Survey Processing with Meta-Programming -Version: 0.0.1.9000 +Version: 0.0.1.9001 URL: www.mauroloprete.com Authors@R: c( From 5f48bb1b1ef52478cf0a922f1dcbce507e0d45f9 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Thu, 24 Oct 2024 11:17:35 -0300 Subject: [PATCH 02/26] Response in public key debug --- R/utils.R | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/R/utils.R b/R/utils.R index d6fb4e6..102adb0 100644 --- a/R/utils.R +++ b/R/utils.R @@ -136,6 +136,12 @@ public_key <- function() { url <- "https://services.cloud.mongodb.com/api/client/v2.0/app/data-vonssxi/auth/providers/anon-user/login" response <- POST(url) content <- content(response) + + if (response$status_code != 200) { + stop("Error getting public key") + cat(content) + } + return(content$access_token) } From 241b406bb1397e62596ac38b0d6e323023138f46 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Thu, 24 Oct 2024 16:34:13 -0300 Subject: [PATCH 03/26] Fix host mongo US --- R/utils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/utils.R b/R/utils.R index 102adb0..c38b7b8 100644 --- a/R/utils.R +++ b/R/utils.R @@ -111,7 +111,7 @@ get_user <- function() { #' @noRd url_api_host <- function() { - default_host <- "https://sa-east-1.aws.data.mongodb-api.com/app/data-vonssxi/endpoint/data/v1/action/" + default_host <- "https://data.mongodb-api.com/app/data-vonssxi/endpoint/data/v1/action/" getOption("metasurvey.base_url") %||% default_host } From b3fe5fa7ad2785f541ec9ef949224e07086c29e0 Mon Sep 17 00:00:00 2001 From: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Fri, 25 Oct 2024 00:37:44 -0300 Subject: [PATCH 04/26] visNetwork to suggests (#64) --- DESCRIPTION | 2 +- NAMESPACE | 7 ------- R/steps.R | 28 +++++++++++++--------------- 3 files changed, 14 insertions(+), 23 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 56a6f19..c2a9292 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -33,10 +33,10 @@ Imports: jsonlite (>= 1.7.2), R6 (>= 2.5.0), emoji (>= 15.0), - visNetwork (>= 2.0.9), survey (>= 4.2.1), methods Suggests: + visNetwork (>= 2.0.9), roxygen2 (>= 7.1.2), testthat (>= 3.0.0), tibble (>= 3.1.3), diff --git a/NAMESPACE b/NAMESPACE index be22437..82d2a23 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -66,10 +66,3 @@ importFrom(methods,is) importFrom(stats,coef) importFrom(survey,SE) importFrom(survey,cv) -importFrom(visNetwork,addFontAwesome) -importFrom(visNetwork,visEdges) -importFrom(visNetwork,visGroups) -importFrom(visNetwork,visHierarchicalLayout) -importFrom(visNetwork,visLegend) -importFrom(visNetwork,visNetwork) -importFrom(visNetwork,visOptions) diff --git a/R/steps.R b/R/steps.R index 36cd391..ebae6ac 100644 --- a/R/steps.R +++ b/R/steps.R @@ -443,13 +443,6 @@ get_type_step <- function(steps) { #' View graph #' @param svy Survey object #' @param init_step Initial step -#' @importFrom visNetwork visNetwork -#' @importFrom visNetwork visGroups -#' @importFrom visNetwork visEdges -#' @importFrom visNetwork visHierarchicalLayout -#' @importFrom visNetwork visLegend -#' @importFrom visNetwork visOptions -#' @importFrom visNetwork addFontAwesome #' @return Graph #' @keywords Survey methods #' @keywords Steps @@ -462,6 +455,10 @@ view_graph <- function(svy, init_step = "Load survey") { formulas <- get_formulas(steps) comments <- get_comments(steps) + if (!requireNamespace("visNetwork", quietly = TRUE)) { + stop("Package 'visNetwork' is required for this function. Please install it.") + } + if (init_step == "Load survey") { init_step <- glue::glue_col( " @@ -519,12 +516,12 @@ view_graph <- function(svy, init_step = "Load survey") { ) ) - visNetwork( + visNetwork::visNetwork( nodes = nodes, edges = edges, height = "500px", width = "100%" ) |> - visGroups( + visNetwork::visGroups( groupname = "Load survey", shape = "icon", icon = list( @@ -533,7 +530,7 @@ view_graph <- function(svy, init_step = "Load survey") { ), shadow = list(enabled = TRUE) ) |> - visGroups( + visNetwork::visGroups( groupname = "compute", shape = "icon", icon = list( @@ -542,7 +539,7 @@ view_graph <- function(svy, init_step = "Load survey") { ), shadow = list(enabled = TRUE) ) |> - visGroups( + visNetwork::visGroups( groupname = "recode", shape = "icon", icon = list( @@ -551,9 +548,9 @@ view_graph <- function(svy, init_step = "Load survey") { ), shadow = list(enabled = TRUE) ) |> - addFontAwesome() |> - visEdges(arrows = "to") |> - visHierarchicalLayout( + visNetwork::addFontAwesome() |> + visNetwork::visEdges(arrows = "to") |> + visNetwork::visHierarchicalLayout( direction = "LR", levelSeparation = 200 ) |> @@ -562,12 +559,13 @@ view_graph <- function(svy, init_step = "Load survey") { clickToUse = TRUE, manipulation = FALSE ) |> - visLegend( + visNetwork::visLegend( width = 0.2, position = "left", main = "Type", zoom = FALSE ) + } From a84b903d6025dea548e9372754ff311aa66b74a3 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Fri, 25 Oct 2024 11:56:32 -0300 Subject: [PATCH 05/26] Workflow return only result --- R/workflow.R | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/R/workflow.R b/R/workflow.R index 4fdef22..3655bf9 100644 --- a/R/workflow.R +++ b/R/workflow.R @@ -34,11 +34,7 @@ workflow <- function(survey, ...) { ) return( - list( - survey = survey, - calls = .calls, - result = result - ) + result ) } ) From 0726d4e2b662f47329b59c3c398407a38f026d82 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Fri, 25 Oct 2024 01:23:53 -0300 Subject: [PATCH 06/26] New logo closes #66 --- DESCRIPTION | 3 ++- man/figures/logo.png | Bin 0 -> 149323 bytes man/metasurvey-package.Rd | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 man/figures/logo.png diff --git a/DESCRIPTION b/DESCRIPTION index c2a9292..455e5a9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: metasurvey Title: Survey Processing with Meta-Programming Version: 0.0.1.9001 -URL: www.mauroloprete.com +URL: https://github.com/metasurveyr/metasurvey Authors@R: c( person( @@ -21,6 +21,7 @@ Authors@R: ) ) ) +Logo: man/figures/logo.png Description: Provides a set of functions to process survey data using meta-programming. It is designed to work with the 'survey' package, but it can be used with any other package that provides a similar data structure. The main goal of this package is to provide a set of functions that can be used to process survey data in a more efficient way, by using meta-programming to generate code that can be used to process the data. License: GPL (>= 3) Imports: diff --git a/man/figures/logo.png b/man/figures/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8e49832f15a324da82f607e80df4f4cd3a45a4bf GIT binary patch literal 149323 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

YN^DstlS`KUJCh&heEVPIft{ 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 Date: Fri, 25 Oct 2024 15:06:41 -0300 Subject: [PATCH 07/26] Fix/remove emoji (#68) * Remove emoji dependence * Remove emoji cat recipe * Remove emoji set_weight --- DESCRIPTION | 1 - NAMESPACE | 1 - R/survey.R | 20 +++++++++++--------- R/utils.R | 2 +- man/metasurvey-package.Rd | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 455e5a9..ebc2dac 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -33,7 +33,6 @@ Imports: lifecycle (>= 1.0.0), jsonlite (>= 1.7.2), R6 (>= 2.5.0), - emoji (>= 15.0), survey (>= 4.2.1), methods Suggests: diff --git a/NAMESPACE b/NAMESPACE index 82d2a23..bc3979c 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -50,7 +50,6 @@ importFrom(data.table,data.table) importFrom(data.table,fread) importFrom(data.table,melt) importFrom(data.table,rbindlist) -importFrom(emoji,emoji) importFrom(glue,glue) importFrom(glue,glue_col) importFrom(glue,identity_transformer) diff --git a/R/survey.R b/R/survey.R index 7f02906..2b03a3f 100644 --- a/R/survey.R +++ b/R/survey.R @@ -1,4 +1,5 @@ -Survey <- R6Class("Survey", +Survey <- R6Class( + "Survey", public = list( data = NULL, edition = NULL, @@ -188,7 +189,6 @@ set_weight <- function(svy, new_weight) { #' @description Get metadata from survey #' @keywords Surveymethods #' @importFrom glue glue glue_col -#' @importFrom emoji emoji #' @param self Object of class Survey #' @export @@ -196,12 +196,12 @@ get_metadata <- function(self) { message( glue::glue_col( " - {emoji('information')} {blue Type:} {type} - {emoji('graph')} {blue Edition:} {edition} - {emoji('desktop_computer')} {blue Engine:} {default_engine} - {emoji('abacus')} {blue Design:} {design} - {emoji('mag')} {blue Steps:} {steps} - {emoji('cupcake')} {blue Recipes:} {names_recipes} + {blue Type:} {type} + {blue Edition:} {edition} + {blue Engine:} {default_engine} + {blue Design:} {design} + {blue Steps:} {steps} + {blue Recipes:} {names_recipes} ", type = self$type, edition = self$edition, @@ -422,4 +422,6 @@ bake_recipes <- function(svy, recipes) { } return(svy) -} \ No newline at end of file +} + + diff --git a/R/utils.R b/R/utils.R index db8b2e9..884e885 100644 --- a/R/utils.R +++ b/R/utils.R @@ -27,7 +27,7 @@ validate_weight <- function(svy, weight) { if (!weight %in% colnames(svy)) { stop(glue_col( - "{emoji::emoji('prohibited')} {red Weight {weight} not found in survey}", + "{red Weight {weight} not found in survey}", .literal = TRUE )) } else { diff --git a/man/metasurvey-package.Rd b/man/metasurvey-package.Rd index c9a7806..5abf79e 100644 --- a/man/metasurvey-package.Rd +++ b/man/metasurvey-package.Rd @@ -13,7 +13,7 @@ Provides a set of functions to process survey data using meta-programming. It is \seealso{ Useful links: \itemize{ - \item \url{www.mauroloprete.com} + \item \url{https://github.com/metasurveyr/metasurvey} } } From 73d8f97a7d8618d4b66565889c38700991ca1527 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Sun, 27 Oct 2024 23:08:42 -0300 Subject: [PATCH 08/26] Squashed commit of the following: commit e8b6493cef28c1ab406d70b54006dd527ac70cbd Author: Mauro Loprete Date: Sun Oct 27 23:07:23 2024 -0300 Upgrade version commit 5b04c3a56c8cfb90b3361769b812cb3556be209d Author: Mauro Loprete Date: Sun Oct 27 23:07:00 2024 -0300 Update docs commit 874ebbd6df72c3d5c9ad98a76bbfdf72c5dabc69 Author: Mauro Loprete Date: Sun Oct 27 23:06:36 2024 -0300 Add new functionality estimation_type to workflow commit bca9a88a6f6fe68f5b4f49b32bc8eeb930b38870 Author: Mauro Loprete Date: Sun Oct 27 23:06:11 2024 -0300 New function add_weight and fix params commit 18cf4b10e64d8e8bf56745ec6df90477c168c497 Author: Mauro Loprete Date: Sun Oct 27 23:05:34 2024 -0300 Update cat, attributes design and weight to list commit 6b98d209e0e4b6dffa443f2c6f9d840081182e90 Author: Mauro Loprete Date: Sun Oct 27 23:04:32 2024 -0300 Fix example load_survey to add_weight commit 8d32e160f8b1f0a5ac900abf05f158b45df63d7d Author: Mauro Loprete Date: Sun Oct 27 23:04:07 2024 -0300 Remove comment assign R/steps commit a6840580f8e545cae4185e0c16a0189f8c8ac123 Author: Mauro Loprete Date: Sun Oct 27 16:45:59 2024 -0300 Closes #67 New functions extract_time_pattern group_dates validate_time_pattern R/utils.R On branch feature/53-pool-survey Your branch is up to date with 'origin/feature/53-pool-survey'. commit 63d326dc4ee5429dd46223b03e0792d1af9fd014 Author: Mauro Loprete Date: Sun Oct 27 12:43:11 2024 -0300 Rbuildingore and gitingore --- .Rbuildignore | 4 + .gitignore | 3 +- DESCRIPTION | 2 +- NAMESPACE | 4 + R/load_survey.R | 4 +- R/steps.R | 2 - R/survey.R | 181 ++++++++++++++++++++--------- R/utils.R | 217 +++++++++++++++++++++++++++++++++++ R/workflow.R | 62 ++++++---- man/add_weight.Rd | 18 +++ man/cat_design_type.Rd | 4 +- man/extract_time_pattern.Rd | 18 +++ man/group_dates.Rd | 20 ++++ man/load_survey.Rd | 2 +- man/validate_time_pattern.Rd | 22 ++++ man/workflow.Rd | 4 +- vignettes/eai.Rmd | 8 +- 17 files changed, 483 insertions(+), 92 deletions(-) create mode 100644 man/add_weight.Rd create mode 100644 man/extract_time_pattern.Rd create mode 100644 man/group_dates.Rd create mode 100644 man/validate_time_pattern.Rd diff --git a/.Rbuildignore b/.Rbuildignore index 7e8ed15..cbaca85 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -28,3 +28,7 @@ example-data eaii.R$ test_api.R popac.R +^_pkgdown\.yml$ +^reference$ +^pkgdown$ +pool.R \ No newline at end of file diff --git a/.gitignore b/.gitignore index acba6b5..5ffdf03 100644 --- a/.gitignore +++ b/.gitignore @@ -67,4 +67,5 @@ inst/doc /Meta/ -*.json \ No newline at end of file +*.json +reference diff --git a/DESCRIPTION b/DESCRIPTION index ebc2dac..cdd46a0 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: metasurvey Title: Survey Processing with Meta-Programming -Version: 0.0.1.9001 +Version: 0.0.1.9002 URL: https://github.com/metasurveyr/metasurvey Authors@R: c( diff --git a/NAMESPACE b/NAMESPACE index bc3979c..37201fe 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,17 +1,20 @@ # Generated by roxygen2: do not edit by hand +export(add_weight) export(bake_recipes) export(bake_steps) export(cat_design) export(cat_design_type) export(cat_recipes) export(default_engine) +export(extract_time_pattern) export(get_api_key) export(get_data) export(get_engine) export(get_metadata) export(get_recipe) export(get_steps) +export(group_dates) export(lazy_default) export(load_survey) export(load_survey_example) @@ -31,6 +34,7 @@ export(survey_to_data.table) export(survey_to_data_frame) export(survey_to_tibble) export(use_copy_default) +export(validate_time_pattern) export(view_graph) export(workflow) importFrom(R6,R6Class) diff --git a/R/load_survey.R b/R/load_survey.R index f5328b8..d72de26 100644 --- a/R/load_survey.R +++ b/R/load_survey.R @@ -1,4 +1,4 @@ -#' @title Load survey + #' @title Load survey #' #' @param path Path to the survey file #' @param svy_type Type of survey @@ -13,7 +13,7 @@ #' svy_example <- load_survey( #' svy_type = "eaii", #' svy_edition = "2019-2021", -#' svy_weight = "w_trans", +#' svy_weight = add_weight(annual = "w_trans"), #' input = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", #' dec = "," #' ) diff --git a/R/steps.R b/R/steps.R index ebae6ac..f4ffc19 100644 --- a/R/steps.R +++ b/R/steps.R @@ -171,8 +171,6 @@ step_compute <- function(svy = NULL, ..., .by = NULL, use_copy = use_copy_defaul .names_after <- names(get_data(.svy_after)) .new_vars <- names(exprs)[-1] - # assign("new_vars", .new_vars_temp, envir = .GlobalEnv) - if (length(.new_vars) > 0) { .name_step <- paste0( "New variable: ", diff --git a/R/survey.R b/R/survey.R index 2b03a3f..da1c932 100644 --- a/R/survey.R +++ b/R/survey.R @@ -12,16 +12,33 @@ Survey <- R6Class( design = NULL, initialize = function(data, edition, type, engine, weight, design = NULL, steps = NULL, recipes = NULL) { self$data <- data - self$edition <- edition - self$type <- type - self$default_engine <- engine - self$weight <- validate_weight(data, weight) - self$design <- survey::svydesign( - id = ~1, - weights = as.formula(paste("~", validate_weight(data, weight))), - data = data, - calibrate.formula = ~1 + + time_pattern <- validate_time_pattern( + svy_type = type, + svy_edition = edition + ) + + weight_list <- validate_weight_time_pattern(data, weight) + + design_list <- lapply( + weight_list, + function(x) { + survey::svydesign( + id = ~1, + weights = as.formula(paste("~", x)), + data = data, + calibrate.formula = ~1 + ) + } ) + + names(design_list) <- names(weight_list) + + self$edition <- time_pattern$svy_edition + self$type <- time_pattern$svy_type + self$default_engine <- engine + self$weight <- weight_list + self$design <- design_list self$recipes <- recipes self$workflows <- list() }, @@ -45,7 +62,8 @@ Survey <- R6Class( }, set_weight = function(weight) { data <- self$data - self$weight <- validate_weight(data, weight) + weight_list <- validate_weight_time_pattern(data, weight) + self$weight <- weight_list }, print = function() { get_metadata(self) @@ -73,19 +91,44 @@ Survey <- R6Class( self$design <- design }, update_design = function() { - self$design <- survey::svydesign( - id = ~1, - weights = as.formula(paste("~", validate_weight(self$data, self$weight))), - data = self$data + + weight_list <- validate_weight_time_pattern(self$data, self$weight) + + design_list <- lapply( + weight_list, + function(x) { + survey::svydesign( + id = ~1, + weights = as.formula(paste("~", x)), + data = self$data, + calibrate.formula = ~1 + ) + } ) + + names(design_list) <- names(weight_list) + + self$design <- design_list }, active = list( design = function() { - survey::svydesign( - id = ~1, - weights = as.formula(paste("~", self$weight)), - data = self$data + weight_list <- validate_weight_time_pattern(data, weight) + + design_list <- lapply( + weight_list, + function(x) { + survey::svydesign( + id = ~1, + weights = as.formula(paste("~", x)), + data = data, + calibrate.formula = ~1 + ) + } ) + + names(design_list) <- names(weight_list) + + return(design_list) } ) ) @@ -203,8 +246,12 @@ get_metadata <- function(self) { {blue Steps:} {steps} {blue Recipes:} {names_recipes} ", - type = self$type, - edition = self$edition, + type = toupper(self$type), + edition = ifelse( + is(self$edition, "character"), + self$edition, + format(self$edition, "%Y-%m") + ), default_engine = self$default_engine, design = cat_design(self), steps = ifelse( @@ -241,41 +288,59 @@ get_metadata <- function(self) { #' cat_design <- function(self) { - call <- self$design$call - cluster <- deparse(call$id) %||% "None" - strata <- deparse(call$strata) %||% "None" - weight <- self$weight %||% "None" - fpc <- deparse(call$fpc) %||% "None" - calibrate.formula <- deparse(call$calibrate.formula) %||% "None" - return( - glue::glue_col( - "\n - * {green Type:} {design_type} - * {green PSU:} {cluster} - * {green Strata:} {strata} - * {green Weight:} {weight} - * {green FPC:} {fpc} - * {green Calibrate formula:} {calibrate.formula} - ", - cluster = cluster, - strata = strata, - weight = weight, - fpc = fpc, - design_type = cat_design_type(self) - ) + design_list <- self$design + + + green <- "\033[32m" + reset <- "\033[39m" + red <- "\033[31m" + + output_list <- sapply( + names(design_list), + function(x) { + call <- design_list[[x]]$call + cluster <- deparse(call$id) %||% "None" + strata <- deparse(call$strata) %||% "None" + weight <- self$weight[[x]] %||% "None" + fpc <- deparse(call$fpc) %||% "None" + calibrate.formula <- deparse(call$calibrate.formula) %||% "None" + design_type <- cat_design_type(self, x) + + text <- paste0( + "\n* ", red, paste(toupper(x), "ESTIMATION"), reset, "\n", + " ", design_type, "\n", + " * ", green, "PSU:", reset, " ", cluster, "\n", + " * ", green, "Strata:", reset, " ", strata, "\n", + " * ", green, "Weight:", reset, " ", weight, "\n", + " * ", green, "FPC:", reset, " ", fpc, "\n", + " * ", green, "Calibrate formula:", reset, " ", calibrate.formula + ) + + return(paste("\n ", text)) + } ) + + output <- glue::glue_col(paste0(output_list, collapse = "")) + + return(output) } + + + + + #' @title cat_design_type #' @description Cast design type from survey #' @keywords Surveymethods #' @param self Object of class Survey +#' @param design_name Name of design #' @export #' #' -cat_design_type <- function(self) { +cat_design_type <- function(self, design_name) { design_engine <- list( "survey.design2" = list( package = "survey", @@ -292,29 +357,32 @@ cat_design_type <- function(self) { ) ) - design_engine <- design_engine[[class(self$design)[1]]] + # Obtener la clase del diseño específico + design_class <- class(self$design[[design_name]])[1] + design_details <- design_engine[[design_class]] - if (is.null(design_engine)) { + if (is.null(design_details)) { return("None") } else { + # Determinar el método de estimación de varianza + variance_estimation <- ifelse( + is.list(design_details$variance_estimation), + design_details$variance_estimation[[self$design[[design_name]]$type]], + design_details$variance_estimation + ) return( glue::glue_col( - "\n - * {green Package:} {package} - * {green Variance estimation:} {variance_estimation} - ", - package = design_engine$package, - type = design_engine$type, - variance_estimation = ifelse( - is.list(design_engine$variance_estimation), - design_engine$variance_estimation[self$design$type], - design_engine$variance_estimation - ) + "\n + * {green Package:} {package} + * {green Variance estimation:} {variance_estimation}", + package = design_details$package, + variance_estimation = variance_estimation ) ) } } + #' @title cat_recipes #' @description Cast recipes from survey #' @keywords Surveymethods @@ -425,3 +493,4 @@ bake_recipes <- function(svy, recipes) { } + diff --git a/R/utils.R b/R/utils.R index 884e885..cb74397 100644 --- a/R/utils.R +++ b/R/utils.R @@ -15,6 +15,13 @@ is_blank <- function(x) { } } +#' Validate weight +#' @param svy Survey +#' @param weight Weight +#' @return Weight +#' @keywords utils +#' @keywords internal +#' @noRd validate_weight <- function(svy, weight) { if (is.null(svy)) { @@ -35,6 +42,34 @@ validate_weight <- function(svy, weight) { } } +#' Validate Weight time pattern +#' @param svy Survey +#' @param weight_time_pattern Weight time pattern +#' @return Weight time pattern +#' @keywords utils +#' @keywords internal +#' @noRd + +validate_weight_time_pattern <- function(svy, weight_list) { + if (is.null(svy)) { + return(NULL) + } + + if (!is.list(weight_list)) { + stop("Weight time pattern must be a list") + } + + Map( + f = function(x) { + validate_weight(svy, x) + }, + weight_list + ) + + return(weight_list) +} + + #' Load survey example #' @param svy_type Survey type #' @param svy_edition Survey edition @@ -175,4 +210,186 @@ set_lazy_processing <- function(lazy) { } options(lazy_processing = lazy) +} + + +#' Extract time pattern +#' @param svy_edition Survey edition +#' @return List +#' @keywords utils +#' @export + +extract_time_pattern <- function(svy_edition) { + svy_edition <- gsub("[\\s\\-\\/]+", "_", svy_edition) + svy_edition <- gsub("[_*]+", "_", svy_edition) + svy_edition <- trimws(svy_edition, which = "both") + + type <- NULL + year <- NA + year_start <- NA + year_end <- NA + month <- NA + periodicity <- NA + + if (grepl("^[A-Za-z]+", svy_edition)) { + type <- sub("_.*", "", svy_edition) + svy_edition <- sub("^[A-Za-z]+_*", "", svy_edition,perl = TRUE) + } + + if (nchar(svy_edition) <= 7) { + svy_edition <- gsub("_", "", svy_edition) + } + + # Caso: Mensual en formato YYYYMM (e.g., ECH_202312 o ECH202312) + if (grepl("^\\d{6}$", svy_edition)) { + year <- as.numeric(sub("^(\\d{4})(\\d{2})$", "\\1", svy_edition)) + month <- as.numeric(sub("^\\d{4}(\\d{2})$", "\\1", svy_edition)) + + periodicity <- "Mensual" + result <- list(type = type, year = year, month = month, periodicity = periodicity) + + # Caso: Mensual con formato YYYY_MM o YYYY-MM + } else if (grepl("^(\\d{4})[_-](\\d{2})$", svy_edition)) { + year <- as.numeric(sub("^(\\d{4})[_-](\\d{2})$", "\\1", svy_edition)) + month <- as.numeric(sub("^\\d{4}[_-](\\d{2})$", "\\2", svy_edition)) + periodicity <- "Mensual" + result <- list(type = type, year = year, month = month, periodicity = periodicity) + + # Caso: Encuesta con rango de años (e.g., ECH_2019_2021) + } else if (grepl("^(\\d{4})[_-](\\d{4})$", svy_edition)) { + years <- as.numeric(unlist(regmatches(svy_edition, gregexpr("\\d{4}", svy_edition)))) + year_start <- min(years) + year_end <- max(years) + periodicity <- if (year_end - year_start + 1 == 3) "Trianual" else "Multianual" + result <- list(type = type, year_start = year_start, year_end = year_end, periodicity = periodicity) + + # Caso: Anual (e.g., ECH_2023 o solo 2023) + } else if (grepl("^\\d{4}$", svy_edition)) { + year <- as.numeric(svy_edition) + periodicity <- "Anual" + result <- list(type = type, year = year, periodicity = periodicity) + + # Caso: Mensual con formato YY_MM (e.g., ECH_23_05) + } else if (grepl("^(\\d{2})[_-](\\d{2})$", svy_edition)) { + year <- as.numeric(sub("^(\\d{2})[_-](\\d{2})$", "20\\1", svy_edition)) + month <- as.numeric(sub("^\\d{2}[_-](\\d{2})$", "\\2", svy_edition)) + periodicity <- "Mensual" + result <- list(type = type, year = year, month = month, periodicity = periodicity) + + # Caso por defecto si no hay coincidencia + } else { + result <- list(type = type, year = year, month = month, periodicity = periodicity) + } + + return(result) +} + + + + +#' Validate time pattern +#' @param svy_edition Survey edition +#' @param svy_type Survey type +#' @return Logical +#' @keywords utils +#' @return List +#' @export + +validate_time_pattern <- function(svy_type = NULL, svy_edition = NULL) { + + time_pattern <- extract_time_pattern(svy_edition) + + if (is.null(time_pattern$type) && is.null(svy_type)) { + stop("Type not found. Please provide a valid type in the survey edition or as an argument") + } + + if (!is.null(time_pattern$type) && time_pattern$type != svy_type) { + stop("Type does not match. Please provide a valid type in the survey edition or as an argument") + } + + # Remove svy_type from time_pattern + + names_time <- names(time_pattern) + + remove_attributes <- c("type", "periodicity") + + + svy_editions <- "" + + if (!is.null(time_pattern$month) && !is.na(time_pattern$month) && !is.null(time_pattern$year) && !is.na(time_pattern$year)) { + date_string <- sprintf("%04d-%02d-01", time_pattern$year, time_pattern$month) + svy_edition <- as.Date(date_string) + } else { + # Si no hay mes o año, crear una cadena básica + svy_edition <- Reduce( + time_pattern[names_time[!names_time %in% remove_attributes]], + f = function(x, y) { + paste(x, y, sep = "_") + } + ) + } + + + + return( + list( + svy_type = time_pattern$type %||% svy_type, + svy_edition = svy_edition, + svy_periodicity = time_pattern$periodicity %||% "Anual" + ) + ) + +} + + +#' Group dates +#' @param dates Dates +#' @param type Type +#' @return Group +#' @keywords utils +#' @export + +group_dates <- function(dates, type = c("monthly", "quarter", "semester")) { + + type <- match.arg(type) + dates_lt <- as.POSIXlt(dates) + + group <- integer(length(dates)) + + if (type == "monthly") { + group <- dates_lt$mon + 1 + } else if (type == "quarter") { + group <- (dates_lt$mon %/% 3) + 1 + } else if (type == "semester") { + group <- (dates_lt$mon %/% 6) + 1 + } + + names(group) <- dates + + return(group) +} + + +#' Add Weight time pattern +#' @param monthly Weight monthly +#' @param annual Weight annual +#' @param quarter Weight quarter +#' @export +#' +add_weight <- function( + monthly = NULL, + annual = NULL, + quarter = NULL +) { + + weight_list <- list( + monthly = monthly, + annual = annual, + quarter = quarter + ) + + weight_list_clean <- weight_list[!sapply(weight_list, is.null)] + + return(weight_list_clean) + } \ No newline at end of file diff --git a/R/workflow.R b/R/workflow.R index 3655bf9..9e3b786 100644 --- a/R/workflow.R +++ b/R/workflow.R @@ -3,41 +3,53 @@ #' @keywords Surveymethods #' @param survey Survey object #' @param ... Calls +#' @param estimation_type Estimation type #' @importFrom data.table rbindlist #' @export #' @return Data #' -workflow <- function(survey, ...) { - .calls <- substitute(list(...)) - lapply( - X = seq_along(survey), - function(i) { - survey <- survey[[i]] - - result <- rbindlist( - lapply( - 2:length(.calls), - function(i) { - call <- as.list(.calls[[i]]) - name_function <- deparse(call[[1]]) - call[["design"]] <- substitute(design) - call <- as.call(call) - estimation <- eval(call, envir = list(design = survey$design)) - - +workflow <- function(survey, ..., estimation_type = "monthly") { - return( - cat_estimation(estimation, name_function) + .calls <- substitute(list(...)) + + partial_result = sapply( + estimation_type, + function(x) { + lapply( + X = seq_along(survey), + function(i) { + survey <- survey[[i]] + + result <- rbindlist( + lapply( + 2:length(.calls), + function(i) { + call <- as.list(.calls[[i]]) + name_function <- deparse(call[[1]]) + call[["design"]] <- substitute(design) + call <- as.call(call) + estimation <- eval(call, envir = list(design = survey$design[[x]])) + + + + return( + cat_estimation(estimation, name_function) + ) + } ) - } - ) - ) + ) - return( - result + return( + result + ) + } ) } ) + + names(partial_result) <- estimation_type + return(partial_result) + } cat_estimation <- function(estimation, call) { diff --git a/man/add_weight.Rd b/man/add_weight.Rd new file mode 100644 index 0000000..c4adf8f --- /dev/null +++ b/man/add_weight.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{add_weight} +\alias{add_weight} +\title{Add Weight time pattern} +\usage{ +add_weight(monthly = NULL, annual = NULL, quarter = NULL) +} +\arguments{ +\item{monthly}{Weight monthly} + +\item{annual}{Weight annual} + +\item{quarter}{Weight quarter} +} +\description{ +Add Weight time pattern +} diff --git a/man/cat_design_type.Rd b/man/cat_design_type.Rd index 83dd635..f15cf92 100644 --- a/man/cat_design_type.Rd +++ b/man/cat_design_type.Rd @@ -4,10 +4,12 @@ \alias{cat_design_type} \title{cat_design_type} \usage{ -cat_design_type(self) +cat_design_type(self, design_name) } \arguments{ \item{self}{Object of class Survey} + +\item{design_name}{Name of design} } \description{ Cast design type from survey diff --git a/man/extract_time_pattern.Rd b/man/extract_time_pattern.Rd new file mode 100644 index 0000000..141b9c0 --- /dev/null +++ b/man/extract_time_pattern.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{extract_time_pattern} +\alias{extract_time_pattern} +\title{Extract time pattern} +\usage{ +extract_time_pattern(svy_edition) +} +\arguments{ +\item{svy_edition}{Survey edition} +} +\value{ +List +} +\description{ +Extract time pattern +} +\keyword{utils} diff --git a/man/group_dates.Rd b/man/group_dates.Rd new file mode 100644 index 0000000..ab67e73 --- /dev/null +++ b/man/group_dates.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{group_dates} +\alias{group_dates} +\title{Group dates} +\usage{ +group_dates(dates, type = c("monthly", "quarter", "semester")) +} +\arguments{ +\item{dates}{Dates} + +\item{type}{Type} +} +\value{ +Group +} +\description{ +Group dates +} +\keyword{utils} diff --git a/man/load_survey.Rd b/man/load_survey.Rd index 76a139e..3a54e31 100644 --- a/man/load_survey.Rd +++ b/man/load_survey.Rd @@ -34,7 +34,7 @@ set_engine("data.table") svy_example <- load_survey( svy_type = "eaii", svy_edition = "2019-2021", - svy_weight = "w_trans", + svy_weight = add_weight(annual = "w_trans"), input = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", dec = "," ) diff --git a/man/validate_time_pattern.Rd b/man/validate_time_pattern.Rd new file mode 100644 index 0000000..18cba6f --- /dev/null +++ b/man/validate_time_pattern.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{validate_time_pattern} +\alias{validate_time_pattern} +\title{Validate time pattern} +\usage{ +validate_time_pattern(svy_type = NULL, svy_edition = NULL) +} +\arguments{ +\item{svy_type}{Survey type} + +\item{svy_edition}{Survey edition} +} +\value{ +Logical + +List +} +\description{ +Validate time pattern +} +\keyword{utils} diff --git a/man/workflow.Rd b/man/workflow.Rd index 29ad4a2..41d044f 100644 --- a/man/workflow.Rd +++ b/man/workflow.Rd @@ -4,12 +4,14 @@ \alias{workflow} \title{Workflow} \usage{ -workflow(survey, ...) +workflow(survey, ..., estimation_type = "monthly") } \arguments{ \item{survey}{Survey object} \item{...}{Calls} + +\item{estimation_type}{Estimation type} } \value{ Data diff --git a/vignettes/eai.Rmd b/vignettes/eai.Rmd index 4e928db..1b9ca92 100644 --- a/vignettes/eai.Rmd +++ b/vignettes/eai.Rmd @@ -54,7 +54,9 @@ svy_example <- metasurvey::load_survey( path = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", svy_type = "eaii", svy_edition = "2019-2021", - svy_weight = "w_trans", + svy_weight = add_weight( + annual = "w_trans" + ), dec = "," ) @@ -76,7 +78,9 @@ get_data(svy_example)[1:5, 1:3] eaii_2019 <- metasurvey::load_survey( svy_type = "eaii", svy_edition = "2019-2021", - svy_weight = "w_trans", + svy_weight = add_weight( + annual = "w_trans" + ), input = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", dec = "," ) From e022ff091fce9939f60fa4e083c31b2efde1329f Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Sun, 27 Oct 2024 23:38:15 -0300 Subject: [PATCH 09/26] Fix quarter to quarterly and semester to biannual --- R/utils.R | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/R/utils.R b/R/utils.R index cb74397..d641a7b 100644 --- a/R/utils.R +++ b/R/utils.R @@ -349,7 +349,7 @@ validate_time_pattern <- function(svy_type = NULL, svy_edition = NULL) { #' @keywords utils #' @export -group_dates <- function(dates, type = c("monthly", "quarter", "semester")) { +group_dates <- function(dates, type = c("monthly", "quarterly", "biannual")) { type <- match.arg(type) dates_lt <- as.POSIXlt(dates) @@ -358,9 +358,9 @@ group_dates <- function(dates, type = c("monthly", "quarter", "semester")) { if (type == "monthly") { group <- dates_lt$mon + 1 - } else if (type == "quarter") { + } else if (type == "quarterly") { group <- (dates_lt$mon %/% 3) + 1 - } else if (type == "semester") { + } else if (type == "biannual") { group <- (dates_lt$mon %/% 6) + 1 } @@ -373,19 +373,23 @@ group_dates <- function(dates, type = c("monthly", "quarter", "semester")) { #' Add Weight time pattern #' @param monthly Weight monthly #' @param annual Weight annual -#' @param quarter Weight quarter +#' @param quarterly Weight quarterly +#' @param biannual Weight biannual +#' @keywords utils #' @export #' add_weight <- function( monthly = NULL, annual = NULL, - quarter = NULL + quarterly = NULL, + biannual = NULL ) { weight_list <- list( monthly = monthly, annual = annual, - quarter = quarter + quarterly = quarterly, + biannual = biannual ) weight_list_clean <- weight_list[!sapply(weight_list, is.null)] From b80f657ecca8884b282db7c07397eafa8b8d0906 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Mon, 28 Oct 2024 00:22:05 -0300 Subject: [PATCH 10/26] Update docs --- man/add_weight.Rd | 7 +++++-- man/group_dates.Rd | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/man/add_weight.Rd b/man/add_weight.Rd index c4adf8f..bc9ac9d 100644 --- a/man/add_weight.Rd +++ b/man/add_weight.Rd @@ -4,15 +4,18 @@ \alias{add_weight} \title{Add Weight time pattern} \usage{ -add_weight(monthly = NULL, annual = NULL, quarter = NULL) +add_weight(monthly = NULL, annual = NULL, quarterly = NULL, biannual = NULL) } \arguments{ \item{monthly}{Weight monthly} \item{annual}{Weight annual} -\item{quarter}{Weight quarter} +\item{quarterly}{Weight quarterly} + +\item{biannual}{Weight biannual} } \description{ Add Weight time pattern } +\keyword{utils} diff --git a/man/group_dates.Rd b/man/group_dates.Rd index ab67e73..db71c7e 100644 --- a/man/group_dates.Rd +++ b/man/group_dates.Rd @@ -4,7 +4,7 @@ \alias{group_dates} \title{Group dates} \usage{ -group_dates(dates, type = c("monthly", "quarter", "semester")) +group_dates(dates, type = c("monthly", "quarterly", "biannual")) } \arguments{ \item{dates}{Dates} From 664a373f1d056db79864a510d7bc4a97646dcb7c Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Mon, 28 Oct 2024 00:51:04 -0300 Subject: [PATCH 11/26] Refactor load_survey and new function read_file --- R/load_survey.R | 57 +++++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 35 deletions(-) diff --git a/R/load_survey.R b/R/load_survey.R index d72de26..792c33a 100644 --- a/R/load_survey.R +++ b/R/load_survey.R @@ -69,6 +69,27 @@ load_survey <- function( ) } +#' Read file with data.table +#' @param file +#' @param args Additional arguments +#' @return data.table + +read_file <- function(file, args) { + .extension <- gsub(".*\\.", "", file) + .read_function <- switch(.extension, + sav = list(package = "foreign", read_function = "read.spss"), + dta = list(package = "foreign", read_function = "read.dta"), + csv = list(package = "data.table", read_function = "fread"), + xlsx = list(package = "openxlsx", read_function = "loadWorkbook"), + stop("Unsupported file type: ", .extension) + ) + + require(.read_function$package, character.only = TRUE) + + do.call(.read_function$read_function, args = args) +} + + #' Load survey with data.table #' @param ... Additional arguments #' @inheritDotParams load_survey @@ -89,41 +110,7 @@ load_survey.data.table <- function(...) { .names_args <- .names_args[!.names_args %in% .metadata_args] - .extension <- gsub(".*\\.", "", (.args$file %||% ".csv")) - - .read_function <- switch(.extension, - sav = list( - package = "foreign", - read_function = "read.spss" - ), - dta = list( - package = "foreign", - read_function = "read.spss" - ), - csv = list( - package = "data.table", - read_function = "fread" - ), - xlsx = list( - package = "openxlsx", - read_function = "loadWorkbook" - ) - ) - - - args <- .args[.names_args] - - - - require( - .read_function$package, - character.only = TRUE - ) - - svy <- do.call( - .read_function$read_function, - args = args - ) + svy <- read_file(.args$file, .args[.names_args]) if (!is.null(.args$recipes)) { if (get_distinct_recipes(.args$recipes) > 1) { From 920f5e75dc2a6e4e1a02847ca928d68196c9fe32 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Mon, 28 Oct 2024 04:15:40 -0300 Subject: [PATCH 12/26] Fix read_file xlsx loadWorkbook to read.xlsx. Fix examples --- R/load_survey.R | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/R/load_survey.R b/R/load_survey.R index 792c33a..708b906 100644 --- a/R/load_survey.R +++ b/R/load_survey.R @@ -1,5 +1,4 @@ - #' @title Load survey -#' +#' @title Load survey #' @param path Path to the survey file #' @param svy_type Type of survey #' @param svy_edition Edition of the survey @@ -11,10 +10,10 @@ #' @examples #' set_engine("data.table") #' svy_example <- load_survey( +#' "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", #' svy_type = "eaii", #' svy_edition = "2019-2021", #' svy_weight = add_weight(annual = "w_trans"), -#' input = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", #' dec = "," #' ) #' svy_example @@ -70,23 +69,36 @@ load_survey <- function( } #' Read file with data.table -#' @param file -#' @param args Additional arguments +#' @param file Path to the file +#' @param .args Additional arguments +#' @keywords internal +#' @noRd #' @return data.table -read_file <- function(file, args) { +read_file <- function(file, .args = NULL) { .extension <- gsub(".*\\.", "", file) .read_function <- switch(.extension, sav = list(package = "foreign", read_function = "read.spss"), dta = list(package = "foreign", read_function = "read.dta"), csv = list(package = "data.table", read_function = "fread"), - xlsx = list(package = "openxlsx", read_function = "loadWorkbook"), + xlsx = list(package = "openxlsx", read_function = "read.xlsx"), stop("Unsupported file type: ", .extension) ) require(.read_function$package, character.only = TRUE) - do.call(.read_function$read_function, args = args) + if (is.null(.args)) { + .args <- list(file) + names(.args) <- names(formals(.read_function$read_function)[1]) + } + + .names_args <- names(.args) + + .metadata_args <- metadata_args() + + .names_args <- .names_args[!.names_args %in% .metadata_args] + + do.call(.read_function$read_function, args = .args[.names_args]) } @@ -109,7 +121,7 @@ load_survey.data.table <- function(...) { .metadata_args <- metadata_args() .names_args <- .names_args[!.names_args %in% .metadata_args] - + svy <- read_file(.args$file, .args[.names_args]) if (!is.null(.args$recipes)) { From 62b5eca135dcabca39e021995445595db2c05ea5 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Mon, 28 Oct 2024 04:16:40 -0300 Subject: [PATCH 13/26] Use copy, repdesign and fix update desing performance --- R/survey.R | 125 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 88 insertions(+), 37 deletions(-) diff --git a/R/survey.R b/R/survey.R index da1c932..b383460 100644 --- a/R/survey.R +++ b/R/survey.R @@ -23,12 +23,23 @@ Survey <- R6Class( design_list <- lapply( weight_list, function(x) { - survey::svydesign( - id = ~1, - weights = as.formula(paste("~", x)), - data = data, - calibrate.formula = ~1 - ) + if (is.character(x)) { + survey::svydesign( + id = ~1, + weights = as.formula(paste("~", x)), + data = data, + calibrate.formula = ~1 + ) + } else { + + survey::svrepdesign( + id = ~1, + weights = as.formula(paste("~", x$weight)), + data = merge(data, x$replicate_file, by.x = names(x$replicate_id), by.y = x$replicate_id), + repweights = x$replicate_pattern, + type = x$replicate_type + ) + } } ) @@ -61,6 +72,7 @@ Survey <- R6Class( self$type <- type }, set_weight = function(weight) { + message("Setting weight") data <- self$data weight_list <- validate_weight_time_pattern(data, weight) self$weight <- weight_list @@ -92,37 +104,49 @@ Survey <- R6Class( }, update_design = function() { - weight_list <- validate_weight_time_pattern(self$data, self$weight) + weight_list <- self$weight design_list <- lapply( weight_list, function(x) { - survey::svydesign( - id = ~1, - weights = as.formula(paste("~", x)), - data = self$data, - calibrate.formula = ~1 - ) + if (is.character(x)) { + self$design[[1]]$variables <- self$data + } else { + self$design[[1]]$variables <- merge( + self$data, + x$replicate_file, + by.x = names(x$replicate_id), + by.y = x$replicate_id + ) + } } ) - names(design_list) <- names(weight_list) - - self$design <- design_list + }, active = list( design = function() { - weight_list <- validate_weight_time_pattern(data, weight) + weight_list <- self$weight design_list <- lapply( weight_list, function(x) { - survey::svydesign( - id = ~1, - weights = as.formula(paste("~", x)), - data = data, - calibrate.formula = ~1 - ) + if (is.character(x)) { + survey::svydesign( + id = ~1, + weights = as.formula(paste("~", x)), + data = self$data, + calibrate.formula = ~1 + ) + } else { + survey::svrepdesign( + id = ~1, + weights = as.formula(paste("~", x$weight)), + data = merge(self$data, x$replicate_file, by.x = names(x$replicate_id), by.y = x$replicate_id), + repweights = x$replicate_pattern, + type = x$replicate_type + ) + } } ) @@ -200,32 +224,55 @@ get_design <- function(self) { self$active$design() } -set_data <- function(svy, data, .copy = TRUE) { +set_data <- function(svy, data, .copy = use_copy_default()) { if (.copy) { clone <- svy$clone() clone$set_data(data) return(clone) } else { svy$set_data(data) + return(svy) } } -set_edition <- function(svy, new_edition) { - clone <- svy$clone() - clone$set_edition(new_edition) - return(clone) +set_edition <- function(svy, new_edition, .copy = use_copy_default()) { + + if (.copy) { + clone <- svy$clone() + clone$set_edition(new_edition) + return(clone) + } else { + svy$set_edition(new_edition) + return(svy) + } } -set_type <- function(svy, new_type) { - clone <- svy$clone() - clone$set_type(new_type) - return(clone) +set_type <- function(svy, new_type, .copy = use_copy_default()) { + + if(.copy) { + clone <- svy$clone() + clone$set_type(new_type) + return(clone) + } else { + svy$set_type(new_type) + return(svy) + } } -set_weight <- function(svy, new_weight) { - clone <- svy$clone() - clone$set_weight(new_weight) - return(clone) +set_weight <- function(svy, new_weight, .copy = use_copy_default()) { + if (.copy) { + clone <- svy$clone() + clone$set_weight(new_weight) + return(clone) + } else { + + if(svy$weight == new_weight) { + return(svy) + } + + svy$set_weight(new_weight) + return(svy) + } } #' @title get_metadata @@ -301,7 +348,11 @@ cat_design <- function(self) { call <- design_list[[x]]$call cluster <- deparse(call$id) %||% "None" strata <- deparse(call$strata) %||% "None" - weight <- self$weight[[x]] %||% "None" + weight <- ifelse( + is.character(self$weight[[x]]), + self$weight[[x]] %||% "None", + self$weight[[x]]$weight %||% "None" + ) fpc <- deparse(call$fpc) %||% "None" calibrate.formula <- deparse(call$calibrate.formula) %||% "None" design_type <- cat_design_type(self, x) From ac975dca39ed31d1d20861fa19b21f08962cf621 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Mon, 28 Oct 2024 04:17:22 -0300 Subject: [PATCH 14/26] New functions validate_replicate add_replicate --- R/utils.R | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 89 insertions(+), 3 deletions(-) diff --git a/R/utils.R b/R/utils.R index d641a7b..ff790b9 100644 --- a/R/utils.R +++ b/R/utils.R @@ -42,6 +42,56 @@ validate_weight <- function(svy, weight) { } } +#' Validate Replicate +#' @param svy Survey +#' @param replicate Replicate +#' @return Replicate +#' @keywords utils +#' @keywords internal +#' @noRd + +validate_replicate <- function(svy, replicate) { + if (is.null(svy)) { + return(NULL) + } + + if (!is.null(replicate$replicate_id)) { + if (!is.character(replicate$replicate_id)) { + stop("Replicate ID must be a character") + } + + if (!all(names(replicate$replicate_id) %in% colnames(svy))) { + stop(glue_col( + "{red Replicate ID {replicate$replicate_id} not found in survey}", + .literal = TRUE + )) + } + + } + + replicate_file = read_file(replicate$replicate_path) + + if (!is.null(replicate$replicate_pattern)) { + if (!is.character(replicate$replicate_pattern)) { + stop("Replicate pattern must be a character") + } + + column_names = names(replicate_file) + + if (!any(grepl(replicate$replicate_pattern, column_names))) { + stop("Replicate pattern not found in replicate file") + } + } + + replicate[['replicate_file']] <- replicate_file + + return( + replicate + ) + +} + + #' Validate Weight time pattern #' @param svy Survey #' @param weight_time_pattern Weight time pattern @@ -61,12 +111,17 @@ validate_weight_time_pattern <- function(svy, weight_list) { Map( f = function(x) { - validate_weight(svy, x) + if (is.character(x = x)) { + validate_weight(svy = svy, weight = x) + } else { + if (is.list(x)) { + validate_replicate(svy = svy, replicate = x) + } + } }, weight_list ) - return(weight_list) } @@ -396,4 +451,35 @@ add_weight <- function( return(weight_list_clean) -} \ No newline at end of file +} + +#' add_replicate +#' @param weight Weight +#' @param replicate_pattern Replicate pattern +#' @param replicate_path Replicate file +#' @param replicate_id Replicate ID +#' @param replicate_type Replicate type +#' @keywords utils +#' @export + +add_replicate <- function( + weight, + replicate_pattern, + replicate_path = NULL, + replicate_id = NULL, + replicate_type +) { + + replicate_list <- list( + weight = weight, + replicate_pattern = replicate_pattern, + replicate_path = replicate_path, + replicate_id = replicate_id, + replicate_type = replicate_type + ) + + replicate_list_clean <- replicate_list[!sapply(replicate_list, is.null)] + + return(replicate_list_clean) +} + From 8d3cc31d8fb79cc90f4474aa5df9d0613880e57a Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Mon, 28 Oct 2024 04:17:56 -0300 Subject: [PATCH 15/26] update docs --- NAMESPACE | 1 + man/load_survey.Rd | 2 +- vignettes/eai.Rmd | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 37201fe..fd27b48 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,5 +1,6 @@ # Generated by roxygen2: do not edit by hand +export(add_replicate) export(add_weight) export(bake_recipes) export(bake_steps) diff --git a/man/load_survey.Rd b/man/load_survey.Rd index 3a54e31..0a79990 100644 --- a/man/load_survey.Rd +++ b/man/load_survey.Rd @@ -32,10 +32,10 @@ Load survey \examples{ set_engine("data.table") svy_example <- load_survey( + "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", svy_type = "eaii", svy_edition = "2019-2021", svy_weight = add_weight(annual = "w_trans"), - input = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", dec = "," ) svy_example diff --git a/vignettes/eai.Rmd b/vignettes/eai.Rmd index 1b9ca92..d7b0568 100644 --- a/vignettes/eai.Rmd +++ b/vignettes/eai.Rmd @@ -51,7 +51,7 @@ Una vez cargada la encuesta obtendremos un objeto de la clase `Survey` que conti # Variable de ponderación: pesoano svy_example <- metasurvey::load_survey( - path = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", + "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", svy_type = "eaii", svy_edition = "2019-2021", svy_weight = add_weight( @@ -76,12 +76,12 @@ get_data(svy_example)[1:5, 1:3] ```{r} eaii_2019 <- metasurvey::load_survey( + "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", svy_type = "eaii", svy_edition = "2019-2021", svy_weight = add_weight( annual = "w_trans" ), - input = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", dec = "," ) ``` From 24d707d2847031f3a813887b0bfa5eceaab96a8e Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Mon, 28 Oct 2024 04:18:16 -0300 Subject: [PATCH 16/26] New version: 0.0.1.9003 --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index cdd46a0..06b248e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: metasurvey Title: Survey Processing with Meta-Programming -Version: 0.0.1.9002 +Version: 0.0.1.9003 URL: https://github.com/metasurveyr/metasurvey Authors@R: c( From 94ee18a6c0e205f4d5bbf8ee46eb2fa032bd2593 Mon Sep 17 00:00:00 2001 From: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Sun, 27 Oct 2024 23:45:45 -0300 Subject: [PATCH 17/26] =?UTF-8?q?Versi=C3=B3n=200.0.1.9002=20(#69)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Version 0.0.1.9001 Squashed commit of the following: commit b34c9abecc09085a9780f6b546a9f72e9584a7a8 Author: Mauro Loprete Date: Wed Oct 23 23:03:26 2024 -0300 Fix version commit 97c20fd033f253eec9b72f045a8b0bb260347ed9 Author: Mauro Loprete Date: Wed Oct 23 08:59:03 2024 -0300 Fix test class in recode to formula commit ed7dc025717188a135da1650aa7f01fe3fc34cc7 Author: Mauro Loprete Date: Wed Oct 23 01:25:21 2024 -0300 Fix NAMESPACE commit 91c5e6e5a2a41b1a4259acee562de685d7dd2336 Author: Mauro Loprete Date: Wed Oct 23 01:15:15 2024 -0300 Fix test commit dd6a14229606bfa2dac405a01ce0fd73728dc089 Merge: 43f4488 141b33c Author: Mauro Loprete Date: Wed Oct 23 01:12:52 2024 -0300 Merge branch 'develop' into feature/use_lazy_evaluation commit 141b33cf6b15c5afdf95ba0a19c7479213423dfc Author: Mauro Loprete Date: Wed Oct 23 01:12:02 2024 -0300 Fix pkgdown site commit 3dc687fc6163f5ba9567a03ef9b7be72bdd24a8d Author: Mauro Loprete Date: Wed Oct 23 00:59:44 2024 -0300 fix bake_Recipe.rd commit 8f7a6ed1de114854417cffd0dd23052ccc802a4d Author: Mauro Loprete Date: Wed Oct 23 00:59:44 2024 -0300 fix bake_Recipe.rd commit 43f4488c0a40ec19df4883050c07637c01c292a3 Author: Mauro Loprete Date: Wed Oct 23 00:59:44 2024 -0300 fix bake_Recipe.rd commit 350aa42259738a2eb13f7756809822a97060ef96 Merge: c67167f 92c75c2 Author: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Wed Oct 23 00:55:40 2024 -0300 Merge pull request #46 from metasurveyr/develop Lazy evaluation commit c67167f8bb81a8eded1c122b88141204601889b5 Merge: 56ad8cc e8c88fc Author: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Sun Oct 13 20:13:26 2024 -0300 Merge pull request #44 from metasurveyr/develop Fix test vignettes commit 56ad8ccf50d05abe1ef7ae2e9a5eea39a4344f6f Merge: bacca81 e84baa5 Author: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Sun Oct 13 11:31:51 2024 -0300 Merge pull request #42 from metasurveyr/develop Develop * Response in public key debug * Fix host mongo US * visNetwork to suggests (#64) * Workflow return only result * New logo closes #66 * Fix/remove emoji (#68) * Remove emoji dependence * Remove emoji cat recipe * Remove emoji set_weight * Squashed commit of the following: commit e8b6493cef28c1ab406d70b54006dd527ac70cbd Author: Mauro Loprete Date: Sun Oct 27 23:07:23 2024 -0300 Upgrade version commit 5b04c3a56c8cfb90b3361769b812cb3556be209d Author: Mauro Loprete Date: Sun Oct 27 23:07:00 2024 -0300 Update docs commit 874ebbd6df72c3d5c9ad98a76bbfdf72c5dabc69 Author: Mauro Loprete Date: Sun Oct 27 23:06:36 2024 -0300 Add new functionality estimation_type to workflow commit bca9a88a6f6fe68f5b4f49b32bc8eeb930b38870 Author: Mauro Loprete Date: Sun Oct 27 23:06:11 2024 -0300 New function add_weight and fix params commit 18cf4b10e64d8e8bf56745ec6df90477c168c497 Author: Mauro Loprete Date: Sun Oct 27 23:05:34 2024 -0300 Update cat, attributes design and weight to list commit 6b98d209e0e4b6dffa443f2c6f9d840081182e90 Author: Mauro Loprete Date: Sun Oct 27 23:04:32 2024 -0300 Fix example load_survey to add_weight commit 8d32e160f8b1f0a5ac900abf05f158b45df63d7d Author: Mauro Loprete Date: Sun Oct 27 23:04:07 2024 -0300 Remove comment assign R/steps commit a6840580f8e545cae4185e0c16a0189f8c8ac123 Author: Mauro Loprete Date: Sun Oct 27 16:45:59 2024 -0300 Closes #67 New functions extract_time_pattern group_dates validate_time_pattern R/utils.R On branch feature/53-pool-survey Your branch is up to date with 'origin/feature/53-pool-survey'. commit 63d326dc4ee5429dd46223b03e0792d1af9fd014 Author: Mauro Loprete Date: Sun Oct 27 12:43:11 2024 -0300 Rbuildingore and gitingore * Fix quarter to quarterly and semester to biannual * update docs --- DESCRIPTION | 2 +- NAMESPACE | 1 - R/load_survey.R | 4 +- R/survey.R | 75 ++++++++++++------------------------- R/utils.R | 92 ++-------------------------------------------- man/load_survey.Rd | 1 + vignettes/eai.Rmd | 1 + 7 files changed, 33 insertions(+), 143 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 06b248e..cdd46a0 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: metasurvey Title: Survey Processing with Meta-Programming -Version: 0.0.1.9003 +Version: 0.0.1.9002 URL: https://github.com/metasurveyr/metasurvey Authors@R: c( diff --git a/NAMESPACE b/NAMESPACE index fd27b48..37201fe 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,6 +1,5 @@ # Generated by roxygen2: do not edit by hand -export(add_replicate) export(add_weight) export(bake_recipes) export(bake_steps) diff --git a/R/load_survey.R b/R/load_survey.R index 708b906..4232a3b 100644 --- a/R/load_survey.R +++ b/R/load_survey.R @@ -1,4 +1,5 @@ -#' @title Load survey + #' @title Load survey +#' #' @param path Path to the survey file #' @param svy_type Type of survey #' @param svy_edition Edition of the survey @@ -14,6 +15,7 @@ #' svy_type = "eaii", #' svy_edition = "2019-2021", #' svy_weight = add_weight(annual = "w_trans"), +#' input = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", #' dec = "," #' ) #' svy_example diff --git a/R/survey.R b/R/survey.R index b383460..f00ad0c 100644 --- a/R/survey.R +++ b/R/survey.R @@ -23,23 +23,12 @@ Survey <- R6Class( design_list <- lapply( weight_list, function(x) { - if (is.character(x)) { - survey::svydesign( - id = ~1, - weights = as.formula(paste("~", x)), - data = data, - calibrate.formula = ~1 - ) - } else { - - survey::svrepdesign( - id = ~1, - weights = as.formula(paste("~", x$weight)), - data = merge(data, x$replicate_file, by.x = names(x$replicate_id), by.y = x$replicate_id), - repweights = x$replicate_pattern, - type = x$replicate_type - ) - } + survey::svydesign( + id = ~1, + weights = as.formula(paste("~", x)), + data = data, + calibrate.formula = ~1 + ) } ) @@ -104,49 +93,37 @@ Survey <- R6Class( }, update_design = function() { - weight_list <- self$weight + weight_list <- validate_weight_time_pattern(self$data, self$weight) design_list <- lapply( weight_list, function(x) { - if (is.character(x)) { - self$design[[1]]$variables <- self$data - } else { - self$design[[1]]$variables <- merge( - self$data, - x$replicate_file, - by.x = names(x$replicate_id), - by.y = x$replicate_id - ) - } + survey::svydesign( + id = ~1, + weights = as.formula(paste("~", x)), + data = self$data, + calibrate.formula = ~1 + ) } ) - + names(design_list) <- names(weight_list) + + self$design <- design_list }, active = list( design = function() { - weight_list <- self$weight + weight_list <- validate_weight_time_pattern(data, weight) design_list <- lapply( weight_list, function(x) { - if (is.character(x)) { - survey::svydesign( - id = ~1, - weights = as.formula(paste("~", x)), - data = self$data, - calibrate.formula = ~1 - ) - } else { - survey::svrepdesign( - id = ~1, - weights = as.formula(paste("~", x$weight)), - data = merge(self$data, x$replicate_file, by.x = names(x$replicate_id), by.y = x$replicate_id), - repweights = x$replicate_pattern, - type = x$replicate_type - ) - } + survey::svydesign( + id = ~1, + weights = as.formula(paste("~", x)), + data = data, + calibrate.formula = ~1 + ) } ) @@ -348,11 +325,7 @@ cat_design <- function(self) { call <- design_list[[x]]$call cluster <- deparse(call$id) %||% "None" strata <- deparse(call$strata) %||% "None" - weight <- ifelse( - is.character(self$weight[[x]]), - self$weight[[x]] %||% "None", - self$weight[[x]]$weight %||% "None" - ) + weight <- self$weight[[x]] %||% "None" fpc <- deparse(call$fpc) %||% "None" calibrate.formula <- deparse(call$calibrate.formula) %||% "None" design_type <- cat_design_type(self, x) diff --git a/R/utils.R b/R/utils.R index ff790b9..d641a7b 100644 --- a/R/utils.R +++ b/R/utils.R @@ -42,56 +42,6 @@ validate_weight <- function(svy, weight) { } } -#' Validate Replicate -#' @param svy Survey -#' @param replicate Replicate -#' @return Replicate -#' @keywords utils -#' @keywords internal -#' @noRd - -validate_replicate <- function(svy, replicate) { - if (is.null(svy)) { - return(NULL) - } - - if (!is.null(replicate$replicate_id)) { - if (!is.character(replicate$replicate_id)) { - stop("Replicate ID must be a character") - } - - if (!all(names(replicate$replicate_id) %in% colnames(svy))) { - stop(glue_col( - "{red Replicate ID {replicate$replicate_id} not found in survey}", - .literal = TRUE - )) - } - - } - - replicate_file = read_file(replicate$replicate_path) - - if (!is.null(replicate$replicate_pattern)) { - if (!is.character(replicate$replicate_pattern)) { - stop("Replicate pattern must be a character") - } - - column_names = names(replicate_file) - - if (!any(grepl(replicate$replicate_pattern, column_names))) { - stop("Replicate pattern not found in replicate file") - } - } - - replicate[['replicate_file']] <- replicate_file - - return( - replicate - ) - -} - - #' Validate Weight time pattern #' @param svy Survey #' @param weight_time_pattern Weight time pattern @@ -111,17 +61,12 @@ validate_weight_time_pattern <- function(svy, weight_list) { Map( f = function(x) { - if (is.character(x = x)) { - validate_weight(svy = svy, weight = x) - } else { - if (is.list(x)) { - validate_replicate(svy = svy, replicate = x) - } - } + validate_weight(svy, x) }, weight_list ) + return(weight_list) } @@ -451,35 +396,4 @@ add_weight <- function( return(weight_list_clean) -} - -#' add_replicate -#' @param weight Weight -#' @param replicate_pattern Replicate pattern -#' @param replicate_path Replicate file -#' @param replicate_id Replicate ID -#' @param replicate_type Replicate type -#' @keywords utils -#' @export - -add_replicate <- function( - weight, - replicate_pattern, - replicate_path = NULL, - replicate_id = NULL, - replicate_type -) { - - replicate_list <- list( - weight = weight, - replicate_pattern = replicate_pattern, - replicate_path = replicate_path, - replicate_id = replicate_id, - replicate_type = replicate_type - ) - - replicate_list_clean <- replicate_list[!sapply(replicate_list, is.null)] - - return(replicate_list_clean) -} - +} \ No newline at end of file diff --git a/man/load_survey.Rd b/man/load_survey.Rd index 0a79990..4bd7ce4 100644 --- a/man/load_survey.Rd +++ b/man/load_survey.Rd @@ -36,6 +36,7 @@ svy_example <- load_survey( svy_type = "eaii", svy_edition = "2019-2021", svy_weight = add_weight(annual = "w_trans"), + input = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", dec = "," ) svy_example diff --git a/vignettes/eai.Rmd b/vignettes/eai.Rmd index d7b0568..94d87b1 100644 --- a/vignettes/eai.Rmd +++ b/vignettes/eai.Rmd @@ -82,6 +82,7 @@ eaii_2019 <- metasurvey::load_survey( svy_weight = add_weight( annual = "w_trans" ), + input = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", dec = "," ) ``` From 35b1740bc524007757e4a3314563dd718da22c02 Mon Sep 17 00:00:00 2001 From: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Fri, 25 Oct 2024 00:37:44 -0300 Subject: [PATCH 18/26] visNetwork to suggests (#64) --- DESCRIPTION | 1 + 1 file changed, 1 insertion(+) diff --git a/DESCRIPTION b/DESCRIPTION index cdd46a0..500b1ce 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -33,6 +33,7 @@ Imports: lifecycle (>= 1.0.0), jsonlite (>= 1.7.2), R6 (>= 2.5.0), + emoji (>= 15.0), survey (>= 4.2.1), methods Suggests: From 07d509f37e340f5f2e26c23bd27eebd81a6e3465 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Fri, 25 Oct 2024 11:56:32 -0300 Subject: [PATCH 19/26] Workflow return only result --- R/workflow.R | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/R/workflow.R b/R/workflow.R index 9e3b786..a5ac086 100644 --- a/R/workflow.R +++ b/R/workflow.R @@ -39,10 +39,8 @@ workflow <- function(survey, ..., estimation_type = "monthly") { ) ) - return( - result - ) - } + return( + result ) } ) From 6106dae1704c2b32597b6b715c1b37578b0bf26b Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Fri, 25 Oct 2024 01:23:53 -0300 Subject: [PATCH 20/26] New logo closes #66 --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 500b1ce..455e5a9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: metasurvey Title: Survey Processing with Meta-Programming -Version: 0.0.1.9002 +Version: 0.0.1.9001 URL: https://github.com/metasurveyr/metasurvey Authors@R: c( From 7f5f409ef1150899f050ce42b4a9bc4b3167b03d Mon Sep 17 00:00:00 2001 From: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:06:41 -0300 Subject: [PATCH 21/26] Fix/remove emoji (#68) * Remove emoji dependence * Remove emoji cat recipe * Remove emoji set_weight --- DESCRIPTION | 1 - R/survey.R | 1 - 2 files changed, 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 455e5a9..ebc2dac 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -33,7 +33,6 @@ Imports: lifecycle (>= 1.0.0), jsonlite (>= 1.7.2), R6 (>= 2.5.0), - emoji (>= 15.0), survey (>= 4.2.1), methods Suggests: diff --git a/R/survey.R b/R/survey.R index f00ad0c..75b42f7 100644 --- a/R/survey.R +++ b/R/survey.R @@ -517,4 +517,3 @@ bake_recipes <- function(svy, recipes) { } - From 7765faa771c306dfc222520cb57b9ed9fa3dda9d Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Sun, 27 Oct 2024 23:08:42 -0300 Subject: [PATCH 22/26] Squashed commit of the following: commit e8b6493cef28c1ab406d70b54006dd527ac70cbd Author: Mauro Loprete Date: Sun Oct 27 23:07:23 2024 -0300 Upgrade version commit 5b04c3a56c8cfb90b3361769b812cb3556be209d Author: Mauro Loprete Date: Sun Oct 27 23:07:00 2024 -0300 Update docs commit 874ebbd6df72c3d5c9ad98a76bbfdf72c5dabc69 Author: Mauro Loprete Date: Sun Oct 27 23:06:36 2024 -0300 Add new functionality estimation_type to workflow commit bca9a88a6f6fe68f5b4f49b32bc8eeb930b38870 Author: Mauro Loprete Date: Sun Oct 27 23:06:11 2024 -0300 New function add_weight and fix params commit 18cf4b10e64d8e8bf56745ec6df90477c168c497 Author: Mauro Loprete Date: Sun Oct 27 23:05:34 2024 -0300 Update cat, attributes design and weight to list commit 6b98d209e0e4b6dffa443f2c6f9d840081182e90 Author: Mauro Loprete Date: Sun Oct 27 23:04:32 2024 -0300 Fix example load_survey to add_weight commit 8d32e160f8b1f0a5ac900abf05f158b45df63d7d Author: Mauro Loprete Date: Sun Oct 27 23:04:07 2024 -0300 Remove comment assign R/steps commit a6840580f8e545cae4185e0c16a0189f8c8ac123 Author: Mauro Loprete Date: Sun Oct 27 16:45:59 2024 -0300 Closes #67 New functions extract_time_pattern group_dates validate_time_pattern R/utils.R On branch feature/53-pool-survey Your branch is up to date with 'origin/feature/53-pool-survey'. commit 63d326dc4ee5429dd46223b03e0792d1af9fd014 Author: Mauro Loprete Date: Sun Oct 27 12:43:11 2024 -0300 Rbuildingore and gitingore --- DESCRIPTION | 2 +- R/survey.R | 1 + R/utils.R | 16 ++++++---------- R/workflow.R | 6 ++++-- man/add_weight.Rd | 7 ++----- man/group_dates.Rd | 2 +- 6 files changed, 15 insertions(+), 19 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index ebc2dac..cdd46a0 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: metasurvey Title: Survey Processing with Meta-Programming -Version: 0.0.1.9001 +Version: 0.0.1.9002 URL: https://github.com/metasurveyr/metasurvey Authors@R: c( diff --git a/R/survey.R b/R/survey.R index 75b42f7..f00ad0c 100644 --- a/R/survey.R +++ b/R/survey.R @@ -517,3 +517,4 @@ bake_recipes <- function(svy, recipes) { } + diff --git a/R/utils.R b/R/utils.R index d641a7b..cb74397 100644 --- a/R/utils.R +++ b/R/utils.R @@ -349,7 +349,7 @@ validate_time_pattern <- function(svy_type = NULL, svy_edition = NULL) { #' @keywords utils #' @export -group_dates <- function(dates, type = c("monthly", "quarterly", "biannual")) { +group_dates <- function(dates, type = c("monthly", "quarter", "semester")) { type <- match.arg(type) dates_lt <- as.POSIXlt(dates) @@ -358,9 +358,9 @@ group_dates <- function(dates, type = c("monthly", "quarterly", "biannual")) { if (type == "monthly") { group <- dates_lt$mon + 1 - } else if (type == "quarterly") { + } else if (type == "quarter") { group <- (dates_lt$mon %/% 3) + 1 - } else if (type == "biannual") { + } else if (type == "semester") { group <- (dates_lt$mon %/% 6) + 1 } @@ -373,23 +373,19 @@ group_dates <- function(dates, type = c("monthly", "quarterly", "biannual")) { #' Add Weight time pattern #' @param monthly Weight monthly #' @param annual Weight annual -#' @param quarterly Weight quarterly -#' @param biannual Weight biannual -#' @keywords utils +#' @param quarter Weight quarter #' @export #' add_weight <- function( monthly = NULL, annual = NULL, - quarterly = NULL, - biannual = NULL + quarter = NULL ) { weight_list <- list( monthly = monthly, annual = annual, - quarterly = quarterly, - biannual = biannual + quarter = quarter ) weight_list_clean <- weight_list[!sapply(weight_list, is.null)] diff --git a/R/workflow.R b/R/workflow.R index a5ac086..9e3b786 100644 --- a/R/workflow.R +++ b/R/workflow.R @@ -39,8 +39,10 @@ workflow <- function(survey, ..., estimation_type = "monthly") { ) ) - return( - result + return( + result + ) + } ) } ) diff --git a/man/add_weight.Rd b/man/add_weight.Rd index bc9ac9d..c4adf8f 100644 --- a/man/add_weight.Rd +++ b/man/add_weight.Rd @@ -4,18 +4,15 @@ \alias{add_weight} \title{Add Weight time pattern} \usage{ -add_weight(monthly = NULL, annual = NULL, quarterly = NULL, biannual = NULL) +add_weight(monthly = NULL, annual = NULL, quarter = NULL) } \arguments{ \item{monthly}{Weight monthly} \item{annual}{Weight annual} -\item{quarterly}{Weight quarterly} - -\item{biannual}{Weight biannual} +\item{quarter}{Weight quarter} } \description{ Add Weight time pattern } -\keyword{utils} diff --git a/man/group_dates.Rd b/man/group_dates.Rd index db71c7e..ab67e73 100644 --- a/man/group_dates.Rd +++ b/man/group_dates.Rd @@ -4,7 +4,7 @@ \alias{group_dates} \title{Group dates} \usage{ -group_dates(dates, type = c("monthly", "quarterly", "biannual")) +group_dates(dates, type = c("monthly", "quarter", "semester")) } \arguments{ \item{dates}{Dates} From b77750555b8df7cdf88dcd1207fd27b24d23362e Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Wed, 23 Oct 2024 23:54:49 -0300 Subject: [PATCH 23/26] Version 0.0.1.9001 Squashed commit of the following: commit b34c9abecc09085a9780f6b546a9f72e9584a7a8 Author: Mauro Loprete Date: Wed Oct 23 23:03:26 2024 -0300 Fix version commit 97c20fd033f253eec9b72f045a8b0bb260347ed9 Author: Mauro Loprete Date: Wed Oct 23 08:59:03 2024 -0300 Fix test class in recode to formula commit ed7dc025717188a135da1650aa7f01fe3fc34cc7 Author: Mauro Loprete Date: Wed Oct 23 01:25:21 2024 -0300 Fix NAMESPACE commit 91c5e6e5a2a41b1a4259acee562de685d7dd2336 Author: Mauro Loprete Date: Wed Oct 23 01:15:15 2024 -0300 Fix test commit dd6a14229606bfa2dac405a01ce0fd73728dc089 Merge: 43f4488 141b33c Author: Mauro Loprete Date: Wed Oct 23 01:12:52 2024 -0300 Merge branch 'develop' into feature/use_lazy_evaluation commit 141b33cf6b15c5afdf95ba0a19c7479213423dfc Author: Mauro Loprete Date: Wed Oct 23 01:12:02 2024 -0300 Fix pkgdown site commit 3dc687fc6163f5ba9567a03ef9b7be72bdd24a8d Author: Mauro Loprete Date: Wed Oct 23 00:59:44 2024 -0300 fix bake_Recipe.rd commit 8f7a6ed1de114854417cffd0dd23052ccc802a4d Author: Mauro Loprete Date: Wed Oct 23 00:59:44 2024 -0300 fix bake_Recipe.rd commit 43f4488c0a40ec19df4883050c07637c01c292a3 Author: Mauro Loprete Date: Wed Oct 23 00:59:44 2024 -0300 fix bake_Recipe.rd commit 350aa42259738a2eb13f7756809822a97060ef96 Merge: c67167f 92c75c2 Author: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Wed Oct 23 00:55:40 2024 -0300 Merge pull request #46 from metasurveyr/develop Lazy evaluation commit c67167f8bb81a8eded1c122b88141204601889b5 Merge: 56ad8cc e8c88fc Author: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Sun Oct 13 20:13:26 2024 -0300 Merge pull request #44 from metasurveyr/develop Fix test vignettes commit 56ad8ccf50d05abe1ef7ae2e9a5eea39a4344f6f Merge: bacca81 e84baa5 Author: Mauro Loprete <55565968+mauroloprete@users.noreply.github.com> Date: Sun Oct 13 11:31:51 2024 -0300 Merge pull request #42 from metasurveyr/develop Develop --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index cdd46a0..ab74ea6 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: metasurvey Title: Survey Processing with Meta-Programming -Version: 0.0.1.9002 -URL: https://github.com/metasurveyr/metasurvey +Version: 0.0.1.9001 +URL: www.mauroloprete.com Authors@R: c( person( From e9bb4450f7190f0b67fe3930f597b63d96043758 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Thu, 24 Oct 2024 11:17:35 -0300 Subject: [PATCH 24/26] Response in public key debug --- R/utils.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/R/utils.R b/R/utils.R index cb74397..6fcdb26 100644 --- a/R/utils.R +++ b/R/utils.R @@ -173,7 +173,8 @@ public_key <- function() { content <- content(response) if (response$status_code != 200) { - stop(message("Error getting public key",content)) + stop("Error getting public key") + cat(content) } return(content$access_token) From 8406d701f8fa63fc03fb18a175c0115cea760ad6 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Mon, 28 Oct 2024 04:18:16 -0300 Subject: [PATCH 25/26] New version: 0.0.1.9003 --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index ab74ea6..06b248e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: metasurvey Title: Survey Processing with Meta-Programming -Version: 0.0.1.9001 -URL: www.mauroloprete.com +Version: 0.0.1.9003 +URL: https://github.com/metasurveyr/metasurvey Authors@R: c( person( From 00e2c847ef0309e2a7d6dace8d634394939bc8e8 Mon Sep 17 00:00:00 2001 From: Mauro Loprete Date: Mon, 28 Oct 2024 05:10:45 -0300 Subject: [PATCH 26/26] Fix merge 0.0.1.9003 --- NAMESPACE | 1 + R/load_survey.R | 4 +- R/survey.R | 76 +++++++++++++++++++---------- R/utils.R | 111 ++++++++++++++++++++++++++++++++++++++----- man/add_replicate.Rd | 29 +++++++++++ man/add_weight.Rd | 7 ++- man/group_dates.Rd | 2 +- man/load_survey.Rd | 1 - vignettes/eai.Rmd | 1 - 9 files changed, 189 insertions(+), 43 deletions(-) create mode 100644 man/add_replicate.Rd diff --git a/NAMESPACE b/NAMESPACE index 37201fe..fd27b48 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,5 +1,6 @@ # Generated by roxygen2: do not edit by hand +export(add_replicate) export(add_weight) export(bake_recipes) export(bake_steps) diff --git a/R/load_survey.R b/R/load_survey.R index 4232a3b..708b906 100644 --- a/R/load_survey.R +++ b/R/load_survey.R @@ -1,5 +1,4 @@ - #' @title Load survey -#' +#' @title Load survey #' @param path Path to the survey file #' @param svy_type Type of survey #' @param svy_edition Edition of the survey @@ -15,7 +14,6 @@ #' svy_type = "eaii", #' svy_edition = "2019-2021", #' svy_weight = add_weight(annual = "w_trans"), -#' input = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", #' dec = "," #' ) #' svy_example diff --git a/R/survey.R b/R/survey.R index f00ad0c..e382b51 100644 --- a/R/survey.R +++ b/R/survey.R @@ -23,12 +23,23 @@ Survey <- R6Class( design_list <- lapply( weight_list, function(x) { - survey::svydesign( - id = ~1, - weights = as.formula(paste("~", x)), - data = data, - calibrate.formula = ~1 - ) + if (is.character(x)) { + survey::svydesign( + id = ~1, + weights = as.formula(paste("~", x)), + data = data, + calibrate.formula = ~1 + ) + } else { + + survey::svrepdesign( + id = ~1, + weights = as.formula(paste("~", x$weight)), + data = merge(data, x$replicate_file, by.x = names(x$replicate_id), by.y = x$replicate_id), + repweights = x$replicate_pattern, + type = x$replicate_type + ) + } } ) @@ -93,37 +104,50 @@ Survey <- R6Class( }, update_design = function() { - weight_list <- validate_weight_time_pattern(self$data, self$weight) + weight_list <- self$weight design_list <- lapply( weight_list, function(x) { - survey::svydesign( - id = ~1, - weights = as.formula(paste("~", x)), - data = self$data, - calibrate.formula = ~1 - ) + if (is.character(x)) { + self$design[[1]]$variables <- self$data + } else { + self$design[[1]]$variables <- merge( + self$data, + x$replicate_file, + by.x = names(x$replicate_id), + by.y = x$replicate_id + ) + } + } ) - names(design_list) <- names(weight_list) - - self$design <- design_list + }, active = list( design = function() { - weight_list <- validate_weight_time_pattern(data, weight) + weight_list <- self$weight design_list <- lapply( weight_list, function(x) { - survey::svydesign( - id = ~1, - weights = as.formula(paste("~", x)), - data = data, - calibrate.formula = ~1 - ) + if (is.character(x)) { + survey::svydesign( + id = ~1, + weights = as.formula(paste("~", x)), + data = self$data, + calibrate.formula = ~1 + ) + } else { + survey::svrepdesign( + id = ~1, + weights = as.formula(paste("~", x$weight)), + data = merge(self$data, x$replicate_file, by.x = names(x$replicate_id), by.y = x$replicate_id), + repweights = x$replicate_pattern, + type = x$replicate_type + ) + } } ) @@ -325,7 +349,11 @@ cat_design <- function(self) { call <- design_list[[x]]$call cluster <- deparse(call$id) %||% "None" strata <- deparse(call$strata) %||% "None" - weight <- self$weight[[x]] %||% "None" + weight <- ifelse( + is.character(self$weight[[x]]), + self$weight[[x]] %||% "None", + self$weight[[x]]$weight %||% "None" + ) fpc <- deparse(call$fpc) %||% "None" calibrate.formula <- deparse(call$calibrate.formula) %||% "None" design_type <- cat_design_type(self, x) diff --git a/R/utils.R b/R/utils.R index 6fcdb26..ff790b9 100644 --- a/R/utils.R +++ b/R/utils.R @@ -42,6 +42,56 @@ validate_weight <- function(svy, weight) { } } +#' Validate Replicate +#' @param svy Survey +#' @param replicate Replicate +#' @return Replicate +#' @keywords utils +#' @keywords internal +#' @noRd + +validate_replicate <- function(svy, replicate) { + if (is.null(svy)) { + return(NULL) + } + + if (!is.null(replicate$replicate_id)) { + if (!is.character(replicate$replicate_id)) { + stop("Replicate ID must be a character") + } + + if (!all(names(replicate$replicate_id) %in% colnames(svy))) { + stop(glue_col( + "{red Replicate ID {replicate$replicate_id} not found in survey}", + .literal = TRUE + )) + } + + } + + replicate_file = read_file(replicate$replicate_path) + + if (!is.null(replicate$replicate_pattern)) { + if (!is.character(replicate$replicate_pattern)) { + stop("Replicate pattern must be a character") + } + + column_names = names(replicate_file) + + if (!any(grepl(replicate$replicate_pattern, column_names))) { + stop("Replicate pattern not found in replicate file") + } + } + + replicate[['replicate_file']] <- replicate_file + + return( + replicate + ) + +} + + #' Validate Weight time pattern #' @param svy Survey #' @param weight_time_pattern Weight time pattern @@ -61,12 +111,17 @@ validate_weight_time_pattern <- function(svy, weight_list) { Map( f = function(x) { - validate_weight(svy, x) + if (is.character(x = x)) { + validate_weight(svy = svy, weight = x) + } else { + if (is.list(x)) { + validate_replicate(svy = svy, replicate = x) + } + } }, weight_list ) - return(weight_list) } @@ -173,8 +228,7 @@ public_key <- function() { content <- content(response) if (response$status_code != 200) { - stop("Error getting public key") - cat(content) + stop(message("Error getting public key",content)) } return(content$access_token) @@ -350,7 +404,7 @@ validate_time_pattern <- function(svy_type = NULL, svy_edition = NULL) { #' @keywords utils #' @export -group_dates <- function(dates, type = c("monthly", "quarter", "semester")) { +group_dates <- function(dates, type = c("monthly", "quarterly", "biannual")) { type <- match.arg(type) dates_lt <- as.POSIXlt(dates) @@ -359,9 +413,9 @@ group_dates <- function(dates, type = c("monthly", "quarter", "semester")) { if (type == "monthly") { group <- dates_lt$mon + 1 - } else if (type == "quarter") { + } else if (type == "quarterly") { group <- (dates_lt$mon %/% 3) + 1 - } else if (type == "semester") { + } else if (type == "biannual") { group <- (dates_lt$mon %/% 6) + 1 } @@ -374,23 +428,58 @@ group_dates <- function(dates, type = c("monthly", "quarter", "semester")) { #' Add Weight time pattern #' @param monthly Weight monthly #' @param annual Weight annual -#' @param quarter Weight quarter +#' @param quarterly Weight quarterly +#' @param biannual Weight biannual +#' @keywords utils #' @export #' add_weight <- function( monthly = NULL, annual = NULL, - quarter = NULL + quarterly = NULL, + biannual = NULL ) { weight_list <- list( monthly = monthly, annual = annual, - quarter = quarter + quarterly = quarterly, + biannual = biannual ) weight_list_clean <- weight_list[!sapply(weight_list, is.null)] return(weight_list_clean) -} \ No newline at end of file +} + +#' add_replicate +#' @param weight Weight +#' @param replicate_pattern Replicate pattern +#' @param replicate_path Replicate file +#' @param replicate_id Replicate ID +#' @param replicate_type Replicate type +#' @keywords utils +#' @export + +add_replicate <- function( + weight, + replicate_pattern, + replicate_path = NULL, + replicate_id = NULL, + replicate_type +) { + + replicate_list <- list( + weight = weight, + replicate_pattern = replicate_pattern, + replicate_path = replicate_path, + replicate_id = replicate_id, + replicate_type = replicate_type + ) + + replicate_list_clean <- replicate_list[!sapply(replicate_list, is.null)] + + return(replicate_list_clean) +} + diff --git a/man/add_replicate.Rd b/man/add_replicate.Rd new file mode 100644 index 0000000..71d7cd5 --- /dev/null +++ b/man/add_replicate.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{add_replicate} +\alias{add_replicate} +\title{add_replicate} +\usage{ +add_replicate( + weight, + replicate_pattern, + replicate_path = NULL, + replicate_id = NULL, + replicate_type +) +} +\arguments{ +\item{weight}{Weight} + +\item{replicate_pattern}{Replicate pattern} + +\item{replicate_path}{Replicate file} + +\item{replicate_id}{Replicate ID} + +\item{replicate_type}{Replicate type} +} +\description{ +add_replicate +} +\keyword{utils} diff --git a/man/add_weight.Rd b/man/add_weight.Rd index c4adf8f..bc9ac9d 100644 --- a/man/add_weight.Rd +++ b/man/add_weight.Rd @@ -4,15 +4,18 @@ \alias{add_weight} \title{Add Weight time pattern} \usage{ -add_weight(monthly = NULL, annual = NULL, quarter = NULL) +add_weight(monthly = NULL, annual = NULL, quarterly = NULL, biannual = NULL) } \arguments{ \item{monthly}{Weight monthly} \item{annual}{Weight annual} -\item{quarter}{Weight quarter} +\item{quarterly}{Weight quarterly} + +\item{biannual}{Weight biannual} } \description{ Add Weight time pattern } +\keyword{utils} diff --git a/man/group_dates.Rd b/man/group_dates.Rd index ab67e73..db71c7e 100644 --- a/man/group_dates.Rd +++ b/man/group_dates.Rd @@ -4,7 +4,7 @@ \alias{group_dates} \title{Group dates} \usage{ -group_dates(dates, type = c("monthly", "quarter", "semester")) +group_dates(dates, type = c("monthly", "quarterly", "biannual")) } \arguments{ \item{dates}{Dates} diff --git a/man/load_survey.Rd b/man/load_survey.Rd index 4bd7ce4..0a79990 100644 --- a/man/load_survey.Rd +++ b/man/load_survey.Rd @@ -36,7 +36,6 @@ svy_example <- load_survey( svy_type = "eaii", svy_edition = "2019-2021", svy_weight = add_weight(annual = "w_trans"), - input = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", dec = "," ) svy_example diff --git a/vignettes/eai.Rmd b/vignettes/eai.Rmd index 94d87b1..d7b0568 100644 --- a/vignettes/eai.Rmd +++ b/vignettes/eai.Rmd @@ -82,7 +82,6 @@ eaii_2019 <- metasurvey::load_survey( svy_weight = add_weight( annual = "w_trans" ), - input = "https://raw.githubusercontent.com/metasurveyr/metasurvey_data/main/eaii/2019-2021.csv", dec = "," ) ```