← Back to all sparks
L

libr

ANALYTICS
Velocity2.5

Libraries, Data Dictionaries, and a Data Step for R

The SAS datastep clone for R just got roughly nineteen times faster.

sas-migrationdata-processingperformancer-packageclinical-reporting
Current state
libr gives R users SAS-style data libraries and a datastep() construct, sitting alongside logr, reporter and procs in the r-sassy suite for analysts moving clinical workflows off SAS. Most of its release history is narrow bug-fixing in the libname() readers, particularly the sas7bdat engine. The exception dominates the window: a single 2026 release that rewrote datastep() performance and cut the installed package to a quarter of its former size.
Where it's heading
Two threads run through these entries — steady correctness work on SAS file import, and a much less frequent but far more consequential push on making datastep() viable at real data volumes. The recent fix to empty-variable typing suggests the sas7bdat reader is still where edge cases surface. Having addressed both speed and package size in one release, the obvious remaining pressure is correctness and coverage of SAS semantics rather than throughput.
Prediction
Expect the next releases to continue narrowing sas7bdat import edge cases, with any further datastep() work aimed at supporting more SAS syntax rather than at speed.

Recent moves

  1. 11d ago

    sas7bdat import no longer types empty variables as logical

    Fixes libname()'s sas7bdat engine importing empty variables as logical rather than character. A narrow fix, but a data-integrity one — the wrong type propagates silently into downstream joins and formatting rather than failing loudly. Continues the pattern of import edge cases surfacing in the SAS file readers.

    View source ↗
  2. 3mo ago

    datastep() runs 83K rows in 21.6 seconds instead of 6.7 minutes

    ⚡ SPARK

    The release that changes what libr is usable for: datastep(), the package's central SAS-emulation construct, drops from 6.7 minutes to 21.6 seconds on 83,000 rows, and the installed package falls from 2.6MB to 745KB. Wildcard support on keep and drop lands alongside. Against a release history of narrow import fixes, this is the one entry that moves the package's practical ceiling rather than its correctness.

    View source ↗
  3. 5mo ago

    Test data removed to reduce package size

    Strips some bundled test data to shrink the package. A first, modest pass at the size problem that the following release addressed far more aggressively. No functional change.

    View source ↗
  4. 2y ago

    libname() no longer fails on an empty dataset

    Fixes libname() failing when it encounters an empty dataset. One more entry in the long run of narrow import-path corrections that make up most of this package's history.

    View source ↗
  5. 2y ago

    lib_write() detects dataset changes again

    Fixes lib_write() not detecting changes to datasets held in a libname. A correctness fix in the library-writing path with no interface change.

    View source ↗
  6. 2y ago

    libname() handles file names containing multiple dots

    Fixes a libname() bug on file names with multiple dots. Characteristic of the file-name and file-format edge cases this package accumulates from real SAS directories.

    View source ↗