Releases: SomaLogic/SomaDataIO
SomaDataIO 6.5.0
Function and Object Improvements
- Updated
preProcessAdat()to improve clarityfilter.qcparameter has been renamed tofilter.rowcheck- for backward compatibility,
filter.qcis still accepted but will generate
a deprecation warning and will be removed in a future version - removed language that discusses implication of
ColCheckSeqIds not
being removed frompreProcessAdat()output
- Updated
read_annotations()function andver_dictobject to
recognize latest menu annotations files from Q3 2025
Documentation Updates
- updated statistical analysis workflow articles with clearer
messaging comments aroundpreProcessAdat() - updated two-group and three-group analysis workflow articles to
setcenter.scale = FALSEinpreProcessAdat()to align with guidance
to users for univariate analysis
Internal 🚧
- Updated
dplyrverb tests to no longer explicitly test
for ordering of attributes (#165)
SomaDataIO 6.4.0
New Functions
-
Added
updateColMeta()function- added utility function to update the column metadata in an
ADAT to match an annotations object fromread_annotations()
- added utility function to update the column metadata in an
-
Added
is.AptName()to check for AptName formatis.apt()may return TRUE for both SeqIds and AptNames- wrote new function,
is.AptName(), to explicitly check
if a SomaScan identifier is an AptName is.AptName()code and tests based on code/tests fromis.SeqId()
Function and Object Improvements
-
Relaxed file version requirement in
read_annotations()- now returns warning instead of error if annotations
excel file version does not match specific values
- now returns warning instead of error if annotations
-
Updated
preProcessAdat()to handle missingColCheck- added logic to
preProcessAdat()to handle adats
that are missingColCheckin column annotation data
- added logic to
Documentation Updates
- Show package loading in stat workflow vignettes
- move
library()calls loading third-party packages to new
code chunk that now appears in analysis workflow articles
- move
SomaDataIO 6.3.0
New Functions
-
Added
preProcessAdat()function- added new function
preProcessAdat()to filter features,
filter samples, generate data QC plots of normalization
scale factors by covariates, and perform standard analyte
RFU transformations including log10, centering, and scaling
- added new function
-
Added
calcOutlierMap()function- added
calcOutlierMap()and its print and plot
S3 methods, along withgetOutlierIds()for
identifying sample level outliers from outlier map object - added
ggplot2as a package dependency
- added
Function and Object Improvements
- Added
ex_clin_dataobject- a
tibbleobject with additional sample annotation fields
smoking_statusandalcohol_useto demonstrate merging to a
soma_adatobject
- a
Documentation Updates
-
Added pre-processing vignette article
- includes guidance on pre-processing SomaScan data for
a typical analysis - provides an example of recommended workflow of
filtering features, filtering samples, performing data
QC checks, and transformations of RFU features - introduces usage of the
preProcessAdat()function
- includes guidance on pre-processing SomaScan data for
-
Improved adat ingest documentation in
README- added comments to clarify file path input to
read_adat()
example inREADME
- added comments to clarify file path input to
-
Updated stat workflow articles to begin with reading in adat
- updated data preparation chunks with comments about
how to download and read in the theexample_data.adatobject - data preparation chunks now use the
preProcessAdat()
function for pre-processing
- updated data preparation chunks with comments about
-
Added sample annotation merging guidance
- updated
READMEand loading and wrangling vignette
article with section including code to join the
ex_clin_dataobject to theexample_dataadat
- updated
Internal 🚧
- Added helper utility functions for snapshot plot unit tests
- added helper utility functions
figure(),close_figure(),
save_png(), andexpect_snapshot_plot()for saving plot
snapshot output totestthat/helper.R - added snapshot unit tests for
preProcessAdat()
messaging, print and QC plot output
- added helper utility functions
SomaDataIO 6.2.0
New Functions
- Added
calc_eLOD()function (#131)- calculates the estimated limit of detection (eLOD)
for SeqId columns of an inputsoma_adatordata.frame
- calculates the estimated limit of detection (eLOD)
Bug Fixes
-
Fixed
crayonbug andui_bullet()issue (#129, #130)- removed
crayonandusethisas dependencies in favor ofcli - fixed bug in R version 4.4.1 with
ui_bullet()internal
calls withinloadAdatsAsList()andwrite_adat()
- removed
-
Fixed bug in
Summary.soma_adat()operations (#121)- these operations:
min(),max(),any(),range(), etc.
would return the incorrect value due to anas.matrix()
conversion under the hood - now skips that conversion, trips a warning, and carries on
- triggers an error if non-numerics are passed
as part of the '...' outside of asoma_adat,
just likeSummary.data.frame()
- these operations:
Function and Object Improvements
-
collapseAdats()now maintains Cal.Set entries of Col.Meta (#113)- collapsing ADATs can be problematic for the attributes,
especially for large numbers of ADATs collapseAdats()now attempts to smartly
merge the (potentially numerous elements) Col.Meta
attribute in the final object, preserving
the "Cal.Set" and "ColCheck" columns in particular- the resulting
Col.Metaattribute is a combined product
of the individual ADAT elements, and the intersect of the
analyte features (as is the case for therbind()that is called)
- collapsing ADATs can be problematic for the attributes,
-
Updated checksums and versions for Annotations Excel files (#116)
- updated the 7k and 11k file versions and md5sum checksums
- now allows
read_annotations()to load
the individual Excel files
-
Updated
lift_masterobject to alpha sort columns
Documentation Updates
-
Updated company name, license year, and maintainer (#137)
- SomaLogic Operating Co., Inc is now Standard BioTools, Inc.
- updated license and copyright year to 2025
- updated package maintainer to Caleb Scheidel
-
Updated article links in README, intro vignette (#123)
- updated links to articles in README and introduction
vignette to URLs to pkgdown website rather than
vignette()code references - added clarification to above documents that articles are
available on website only rather than traditional vignettes
included with package
- updated links to articles in README and introduction
-
Updates to example documentation
read_annotations()example documentation now points to the
most recent 11k Excel annotations fileparseHeader()example now prints list elements separately,
rather than full object, which slowed website rendering
Internal 🚧
-
Updates to GitHub Action workflows
- added
rhub.yamlconfiguration file to comply withrhubv2 - updated macOS version in
pkgdown.yamlto macOS-14 - added write permission to
pkgdown.yamlfile to enable deployment - changed GitHub Action R checks to MacOS and Windows only
ubuntumachine was taking too long to build
- added
-
Increased package test coverage
- added unit tests for
getSomaScanLiftCCC(),
parseCheck()and release utilities which
were previously untested - increased test coverage for
pivotExpressionSet()
- added unit tests for
-
Added missing package anchors to .Rd files (#139)
- fixed note from remote windows check
related to Rd \link{} targets missing
package anchors
- fixed note from remote windows check
-
Updated README badge (#109)
- now shows 'downloads' per month over total downloads
-
Fixed link in DESCRIPTION; master -> main (#107)
SomaDataIO 6.1.0
Lifting Code 🚀
-
Major restructure of
lift_adat()functionality (@stufield, #81, #78)lift_adat()now takes abridge =argument,
replacing theanno.tbl =argument (which is now deprecated). Lifting
is now performed internally for a better (and safer)
user experience, without the necessity of an
external annotations (Excel) file.- the majority of this refactoring was internal
and the user should not experience a major
disruption to the API. - much improved lifting/bridging documentation (#82)
-
Added a new lifting and bridging vignette (@stufield, #77)
- in addition to the improved lifting documentation
this new vignette provides additional context,
explanation, clear examples, and lifting guidance.
- in addition to the improved lifting documentation
New Functions ✨
-
is_lifted()is new and returns a boolean according to
whether the signal space (RFU) has been previously lifted -
Lifting accessor function for Lin's CCC values (#88)
getSomaScanLiftCCC()accesses the lifting correlations between
SomaScan versions for each analyte- returns a
tibblesplit by sample matrix (serum or plasma)
-
merge_clin()is newly exported (#80)- a thin wrapper that allows users to merge
clinical variables tosoma_adatobjects easily - previously users had to either use the CLI merge tool
or merge in clinical variables themselves withdplyr
- a thin wrapper that allows users to merge
-
Newly exported ADAT "get**" helpers (#83)
- functions to access properties of ADATs
getAdatVersion()getSomaScanVersion()getSignalSpace()checkSomaScanVersion()
getAdatVersion()gets a new S3 method (#92)- this enables passing of different objects
- namely
soma_adatorlistdepending on the situation
- functions to access properties of ADATs
-
Newly exported functions that were previously internal only:
addAttributes()addClass()cleanNames()
New Vignettes 🤓
-
The package
READMEis now simplified (#35)- example analysis workflows are now split out
into their own vignettes/articles
and cross-linked in theREADME
- example analysis workflows are now split out
-
Reorganization and expansion of statistical vignettes (#35, #47)
- moved 3 existing statistical examples from
READMEinto their own vignettes - resulting in four new "Statistical Workflow" vignettes/articles:
- Binary classification via logistic regression
- Linear regression for continuous variables
- Two-group comparison via t-test
- Three-group analysis ANOVA
- moved 3 existing statistical examples from
-
Added new general analysis workflow vignettes
- articles for the pkgdown website have been built out
- new articles on:
- safely mapping values among variables
- safely renaming a data frame
- loading-and-wrangling
- typical train and test data splits
- beginning the FAQs and/or Coming Soon pages
-
Added a new vignette describing how to use the
command-line interface merge tool (#45)- the new CLI merge tool used to add
new clinical data to existing ADAT file
- the new CLI merge tool used to add
Updates and Improvements 🔨
-
collapseAdats()better combinesHEADERinformation (#86)- certain information, e.g.
PlateScaleandCal*,
are better maintained in the final collapsed ADAT - other entries are combined by pasting into a single string
- should result in less duplication of superfluous entries and
retention of more "useful"HEADERinformation
in the resulting (collapsed)soma_adat
- certain information, e.g.
-
Update
read_annotations()with11kcontent (#85) -
Update
transform()andscaleAnalytes()scaleAnalytes()(internal) now skips missing references
and is much more like a "step" in therecipespackagetransform()gets edge case protection withdrop = FALSE
in case a single-analytesoma_adatis scaled.
-
New
row.names()S3 method support forsoma_adatclass- dispatched on calls to
rownmaes() - rather than calling
NextMethod()which normally
would invokedata.frame, we now force thedata.frame
method in case there aretbl_dforgrouped_df
classes present that would be dispatched.
Those are bypassed in favor of thedata.frame
becausetbl_df1) can nuke the attributes, 2)
triggers a warning about adding rownames to atibble.
- dispatched on calls to
-
New
grouped_dfS3 print support for the groupedsoma_adat- now displays Grouping information from a call to
the S3 print method forsoma_adatclass
- now displays Grouping information from a call to
-
New
grouped_dfS3 method support forsoma_adatclass (#66)grouped_dfdata objects previously unsupported and were
interfering with downstream S3 methods fordplyrverbs
onceNextMethod()was called- this support now ensures that the group
methods are maintained, as well as thesoma_adat
class itself (and most importantly, with its attributes intact)
-
tidyr::separate.soma_adat()S3 method was simplified (#72)- now uses
%||%helper internally - expanded error messages inside
stopifnot()to be more informative
- now uses
-
is_intact_attr()is now much quieter, signaling only when called indirectly (#71)- new conditional logic to silences signaling messages when
called from within another function (indirectly) - these previously lead to confusing messages
when they appear in wrappers, whereis_intact_attr()
can be, sometimes deeply, nested in the call stack
- new conditional logic to silences signaling messages when
-
Development and improvements to the
pkgdownwebsite- added new links and improved clarity in YAML
- added new logo at footer
- restyled side bar for easier hyperlinking and getting help
- clicking on the SomaLogic logo in the GitHub
README
now links to thepkgdownwebsite - new "Coming Soon" drop-down section in the website header
to let users know about active progress (but not yet ready
for external publication)
-
SomaDataIOno longer depends ondescpackage- to generate the
README.md
- to generate the
Internal 🚧
-
Internal rowname helpers were upgraded
- they now use internal cross-functions
as originally intended to avoid redundancy, efficiency,
and improved debugging
- they now use internal cross-functions
-
sysdata.rdano longer contains non-exported functions (#59)- new internal helper functions:
convertColMeta()genRowNames()parseCheck()syncColMeta()scaleAnalytes()
- new internal helper functions:
-
Bug-fix for corner-case writing a single-analyte ADAT (#51)
- RFU values are rounded to 1 decimal place when written by
write_adat(), via a call toapply(), which expects a 2-dim object
when replacing those values. write_adat()no longer usesapply()and instead converts
the entire RFU data frame to a matrix (maintains original dimensions),
and use vectorized format conversion viasprintf()- in theory this should be faster because
sprintf()
is only called once on a long vector, rather than
1000s of times on shorter vectors (insideapply()).
- RFU values are rounded to 1 decimal place when written by
SomaDataIO 6.0.0
We are now on CRAN! 🥳
New changes
- New clinical data merge CLI tool (#25)
Rscript --vanilla merge_clin.Rfor merging clinical variables
into existing*.adatSomaScan data files- added 2 new example
meta.csvandmeta2.csvfiles
to run examples with random data but with valid index keys - see
dir(system.file("cli", "merge", package = "SomaDataIO"))
Package data objects
- general reorganization of package objects, trimming
and slimming, renaming, and file structure (#32) example_data.adatwas reduced in size ton = 10samples (from 192)
to conform to CRAN size requirements (< 5MB)- the current file was renamed
example_data10.adatto reflect this change - this likely has far-reaching consequences for users who access
this flat file viasystem.file() - the
example_dataobject itself however remains true to its original
file (https://github.com/SomaLogic/SomaLogic-Data/blob/master/example_data.adat) - the directory location
inst/example/was renamedinst/extdata/
to conform to CRAN package standard naming conventions - the file
single_sample.adatwas removed from package data
as it is now redundant (however still used in unit testing) SomaDataObjectswas renamed and is nowSomaScanObjects
Gradual deprecation
read.adat()is now soft-deprecated; please useread_adat() instead- lifecycle for soft-deprecated
warn()->stop()for functions
that have been been soft deprecated sincev5.0.0getSomamers()getSomamerData()meltExpressionSet()
S3 Methods
- New S3 print method default
tibblehas newmax_extra_cols =argument, which
is set to6for theprint.soma_adatmethod
- New S3 merge method (#31)
- calling
base::merge()on asoma_adatis strongly discouraged - we now redirect users to use
dplyr::*_join()alternatives
which are designed to preservesoma_adatattributes
- calling
Internal upgrades
-
Code hardening for
prepHeaderMeta()- some ADATs do not have
CreatedDateandCreatedBy
in the HEADER entry. This currently breaks the writer - simplified to make more robust but also refactor
to be more convenient (for abnormal ADATs not generated
by standard SomaScan processing) CreatedDateHistorywas removed as an entry from written ADATsCreatedByHistorywas combined and dated for written ADATsNULLbehavior remains if keys are missingCreatedByandCreatedDatewill be generated either
as new entries or over-written as appropriate
- some ADATs do not have
-
Numerous non-user-facing (API) changes internal package
maintenance, efficiency, and structural upgrades were included
SomaDataIO 5.3.1
This bug-fix release primarily includes fixes related to write_adat() and its functionality:
-
fixed bug in
write_adat()that resulted from
adding/removing clinical (non-SomaScan) variables to an
ADAT. Export viawrite_adat()resulted in a broken ADAT file (#18) -
write_adat()now has much higher fidelity to original
text file (*.adat) in full-cycle read-write-read operations;
particularly in presence of bangs (!) in the Header
section and in floating point decimals in the?Col.Metasection (#24) -
write_adat()no longer converts commas (,) to
semi-colons (;) in the?Col.Metablock -
write_adat()no longer concatenates written ADATs,
when writing to the same file. Data is over-written
to file to avoid mangled ADATs resulting from re-writing
to the same connection and to match the default behavior
ofwrite.table(),write.csv(), etc. -
read_adat()now has more consistent character type
theBarcode2variable in standard ADATs -
Decreased dependency of
magrittrpipes (%>%) in favor of the native R pipe (|>) -
Migration to the default branch in GitHub from
master->main(#19)
SomaDataIO 5.3.0
Minor version
- updates from internal SomaLogic Operating Co. Inc. code base
- many code simplifications
- reduction in package dependencies have been reduced (in favor of base R implementation)
- speed/implementation improvements
- a minor bug-fix for the
dplyr::mutate.soma_adat()S3 method fordplyr v1.0.8
which included a breaking change that strippedsoma_adatclass attributes. - Enjoy! 🎉
SomaDataIO 5.2.0
Lifting suite
- incorporates SomaScan "lifting" code that allows conversion between SomaScan
v4<->v4.1 - new functions:
lift_adat()read_annotations()
- minor internal structural-refactoring.
SomaDataIO 5.1.0
Minor release version
- internal structural-refactoring changes
- some exported functions were renamed (with redirects for backward compatibility)