Converts a REDCap logic expression into R-compatible logic. Processes one logic expression (logic) for one target variable (var) at a time. Supports common REDCap operators (and, or, =, <, >, etc.) and handles event-specific logic in longitudinal projects. Logic involving smart variables or repeated instruments may require manual review.
Arguments
- project
A list containing the REDCap data, dictionary, and event mapping (expected
redcap_data()output). Overridesdata,dic, andevent_form.- data
A
data.frameortibblewith the REDCap dataset.- dic
A
data.framewith the REDCap dictionary.- event_form
Only applicable for longitudinal projects (presence of events). Event-to-form mapping for longitudinal projects.
- logic
A single REDCap logic string (e.g.,
"if([exc_1]='1' or [inc_1]='0', 1, 0)").- var
A single string specifying the target variable the logic applies to.
Value
A list with:
- rlogic
The translated R-compatible logic as a string.
- eval
The evaluation of the translated logic on the provided dataset, filtered by event if applicable.
Details
Translates REDCap operators and functions into R equivalents:
=→==,<>→!=,and→&,or→|.Converts functions like
if(),rounddown(),datediff(),sum()to R equivalents.
Handles date transformations and empty strings (
'') →NA.Adjusts logic for longitudinal data using
event_formif provided.Evaluates the translated R logic against the dataset and returns the results.
Logic with repeated instruments, smart variables, or multiple events per variable may require manual inspection.
Examples
# Translate a single REDCap logic expression for one variable
covican |>
rd_rlogic(
logic = "if([exc_1]='1' or [inc_1]='0' or [inc_2]='0' or [inc_3]='0', 1, 0)",
var = "screening_fail_crit"
)
#> $rlogic
#> [1] "ifelse(data$exc_1=='1' | data$inc_1=='0' | data$inc_2=='0' | data$inc_3=='0', 1, 0)"
#>
#> $eval
#> [1] 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0
#> [26] NA 0 NA 0 NA 0 NA 0 NA 0 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0
#> [51] NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 0 0 0 NA 0 0 0 0 0 0 0
#> [76] 0 0 0 0 0 0 0 0 0 0 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0
#> [101] NA 0 NA 0 NA 0 NA 0 NA 1 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 1
#> [126] 0 NA 0 NA 0 NA 0 NA 0 NA 0 0 NA 0 NA 0 NA 0 0 0 NA 0 NA 0 NA
#> [151] 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA
#> [176] 0 NA 0 0 NA 0 NA 0 NA 0 0 NA 0 NA 0 0 NA 0 NA 0 NA 0 NA 0 NA
#> [201] 0 NA 0 NA 0 NA 0 NA 0 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA
#> [226] 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0
#> [251] NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA
#> [276] 0 NA 0 NA 0 NA 0 NA 0 NA 1 0 NA 1 0 NA 0 NA 0 0 NA 0 0 NA 0
#> [301] NA 0 0 NA 0 0 NA 0 NA 0 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0
#> [326] NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA 0 NA
#>
