← Back to all sparks
Q

qol

INFRA · APIS
Velocity0.0

Powerful 'SAS' Inspired Concepts for more Efficient Bigger Outputs

A SAS-to-R comfort layer that has quietly grown into its own dialect.

sas-to-rdata-wranglingexcel-reportingtabulationr-packages
Current state
qol is a one-maintainer R package aimed at analysts moving from SAS: SAS-shaped verbs (compute., if./else_if., retain_value, do_if blocks), format-driven tabulation through any_table()/summarise_plus(), and styled Excel output as the default destination. Releases land roughly monthly and each one is large. The recent line has shifted from adding verbs to letting conditions be written as parsed character strings, which is the closest the package gets to reproducing SAS syntax inside R.
Where it's heading
Three threads are visible across these releases. Syntax fidelity is the newest: ifelse_multi() introduced character-string conditions with SAS-style writing, and if./else_if. immediately picked the style up. Tabulation flexibility is the constant — any_table() gains per-variable statistic selection, nested variable combinations in brackets, vector order_by, compute support. The third is ecosystem plumbing the maintainer builds when a gap appears: file I/O in 1.3.0, a console message system, global style options, macro variables, and in 1.3.2 a code_statistics() script scanner. Renames to dodge data.table and dplyr masking recur often enough to be a pattern.
Prediction
The maintainer flagged the new percentile behaviour as a first iteration that only works with few grouping variables, so a performance pass on it is the clearest outstanding item. Beyond that the character-condition syntax has reached three functions in two releases and looks likely to spread to the remaining filter-bearing verbs.

Recent moves

  1. 1mo ago

    ifelse_multi() brings SAS-style string conditions to R

    ifelse_multi() takes multiple conditions as character strings and parses them before evaluation, which is what lets SAS writing styles survive the move to R; if.() and else_if.() adopt the same style in the same release. any_table() gains a compute parameter and per-variable statistic selection via a named list.

    View source ↗
  2. 2mo ago

    code_statistics() scans script folders; retain_stat() generalizes

    code_statistics() reads a folder structure of R scripts and reports on their contents — a static-analysis utility inside a data-wrangling package, and typical of how this maintainer fills gaps. retain_sum() becomes retain_stat() with a statistics parameter, and the label setters and getters collapse into single functions.

    View source ↗
  3. 3mo ago

    compute. and recode. renamed to dodge dplyr masking

    A refinement release with no new functions. compute() and recode() gain a trailing dot to stop masking dplyr, set_up_custom_message() changes shape in a way that breaks existing code, and if.()/else_if.() get starts-with, ends-with and contains shorthand plus a delete keyword. The masking renames are a recurring cost of the package's short verb names.

    View source ↗
  4. 4mo ago

    File I/O, a console message system and do_if filter blocks

    The largest release in the window and the one the maintainer describes as closing gaps so the package becomes its own ecosystem. save_file()/load_file() add fst and rds I/O with write protection, a base R message subsystem arrives whole, and do_if()/else_do() introduce overarching filter variables so a condition need not be repeated. Broad accretion rather than a change of direction.

    View source ↗
  5. 5mo ago

    Row and column percentage keywords; reworked dummy data

    Additions to established functions rather than new ones: any_table() gets row_pct and col_pct keywords and percentages from formatted variable expressions, and rounding switches to round-half-up across the tabulation functions. The dummy_data() generator is rebuilt with more variables and more realistic spread while getting faster.

    View source ↗
  6. 6mo ago

    Macro variables, multi-file import/export and text helpers

    macro() and apply_macro() resolve &-prefixed objects inside titles and labels, reproducing SAS macro variables in R — the same fidelity instinct that later produced string conditions. Alongside them, multi-file csv/xlsx import and export, string helpers, and a print_miss option that emits empty category combinations from the formats.

    View source ↗