Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 37 additions & 4 deletions R/recode-with-table.R
Original file line number Diff line number Diff line change
Expand Up @@ -1164,7 +1164,9 @@ recode_derived_variables <-
variables_details_rows_to_process[
variables_details_rows_to_process[[pkg.env$columns.variable]] == feeder_var, ])
) {
if(!feeder_var %in% c(names(recoded_data), names(data))) {
if(!feeder_var %in% c(names(data), names(recoded_data)) &
!is_start_var_string(feeder_var) &
!is_start_var_numeric(feeder_var)) {
non_func_missing_variables <- c(non_func_missing_variables, feeder_var)
}
}
Expand Down Expand Up @@ -1212,7 +1214,9 @@ recode_derived_variables <-
for (one_feeder in feeder_vars) {
if(!is_table_feeder_var(one_feeder)) {
# Need to check recoded data again in case a recursion added it
if (!one_feeder %in% c(names(data), names(recoded_data))) {
if (!one_feeder %in% c(names(data), names(recoded_data)) &
!is_start_var_string(one_feeder) &
!is_start_var_numeric(one_feeder)) {
derived_return <-
recode_derived_variables(
data = data,
Expand Down Expand Up @@ -1250,15 +1254,24 @@ recode_derived_variables <-
custom_function_args <- list()
for(feeder_var in used_feeder_vars) {
if(is_table_feeder_var(feeder_var)) {
table_name <- get_table_name(feeder_vars)
table_name <- get_table_name(feeder_var)
custom_function_args[[table_name]] <- tables[[table_name]]
} else {
if(feeder_var %in% names(recoded_data)) {
custom_function_args[[feeder_var]] <- recoded_data[recoded_data_row_index, feeder_var]
}
else {
else if(feeder_var %in% names(data)) {
custom_function_args[[feeder_var]] <- data[recoded_data_row_index, feeder_var]
}
else if(is_start_var_string(feeder_var)) {
string_constant_match <- stringr::str_match(
feeder_var, str_constant_regex)
string_constant <- string_constant_match[1, 2]
custom_function_args[[feeder_var]] <- string_constant
}
else {
custom_function_args[[feeder_var]] <- as.numeric(feeder_var)
}
}
}
recoded_variable <- c(
Expand Down Expand Up @@ -1371,3 +1384,23 @@ is_derived_var <- function(variable_details_row) {
derived_var_regex, variable_details_row[1, pkg.env$columns.variableStart]
)) > 0)
}

#' Check whether a start variable is a numeric constant
#'
#' @param x the string to be checked
#' @returns boolean
is_start_var_numeric <- function(x) {
return(!is.na(suppressWarnings(as.numeric(x))))
}

# Regex to check for a string constant
str_constant_regex <- "(?:'|\")(.+)(?:'|\")"

#' Checks whether a start variable is a string constant
#'
#' @param x the string to be checked
#' @returns boolean
is_start_var_string <- function(x) {
return(grepl(str_constant_regex, x))
}

12 changes: 12 additions & 0 deletions tests/testthat/helper-utils.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#' Does the setup and cleanup for a custom function to be used in a
#' rec_with_table test
#'
#' @param custom_function the custom function
#' @param env the environment in which the test is executed. You should not
#' need to set this.
#' @returns NULL
setup_custom_function <- function(custom_function, env = parent.frame()) {
original_name <- deparse(substitute(custom_function))
.GlobalEnv[[original_name]] <- custom_function
withr::defer(rm(list = original_name, envir = .GlobalEnv), env = env)
}
Loading