Read Stable Isotope Data Files
Overview
Interface to the raw data and metadata stored in the file formats commonly encountered in scientific disciplines that make use of stable isotopes. Supports Isodat (.dxf, .cf, .did, .caf, .scn), IonOS (.iarc), LyticOS (.larc), Callisto (.bch), and Qtegra (.imexp) file formats. Provides a consistent data structure together with tools to aggregate, convert signal units, filter, and visualize the extracted data. The approach is described in Kopf et al. (2021) doi:10.21105/joss.02878.
Syntax changes
Reading, aggregating, and all data operations behave exactly as in 0.6. However, there are three syntax changes to the plotting functions (and the corresponding ir_generate_*_tibble() helpers):
| 0.6 | 0.7 |
|---|---|
| mass = NULL / ratio = NULL selected **all** | they now select **none**; use everything() (or just drop the argument) for all |
| a partly matching mass = c(44, 99) silently kept 44 | it is now an error listing the available masses; use any_of() to ignore missing ones |
| the colour aesthetic defaulted to trace | it defaults to the new color column, so a trace and its ratios share one legend entry; pass color = trace for the old behavior |
New features and fixes
- New
ir_plot_traces(), the preferred name for what used to beir_plot_continuous_flow(). It is the same function with the same arguments and return value, just named after the data it plots (traces) rather than the acquisition mode, which leaves room for trace data from other kinds of files in the future.ir_plot_continuous_flow()keeps working as an alias but is now soft-deprecated and passes everything on toir_plot_traces(). Calling it directly warns (at most once every 8 hours): ``r dataset |> ir_plot_traces(facet = file_name) # preferred dataset |> ir_plot_continuous_flow(facet = file_name) # deprecated``
Show all changes in 0.7.0Hide the rest of the changes in 0.7.0
- The
massandratioarguments ofir_plot_traces(),ir_plot_dual_inlet(),ir_plot_scans(), and their_generate_*_tibble()helpers now accept the full **tidyselect** syntax, evaluated as if the masses and ratio names present in the data were column names: ``r ir_plot_traces(dataset, mass = 44:48) # a range of masses ir_plot_traces(dataset, mass = -"45") # all but mass 45 ir_plot_traces(dataset, ratio = starts_with("45")) # all 45/x ratios`Both default toeverything()(all masses / all available ratios) and both takeNULL(orc()) for none. Unlike plain tidyselect, numbers select by name rather than by position, somass = 44:48means the masses 44 to 48, not the 44th to 48th mass; a bare vector held in a variable also works without wrapping it inall_of(). **This inverts the previous meaning ofNULL**, which used to select *all* masses/ratios: replacemass = NULLwithmass = everything()` (or just drop it, since it is the default) to keep the old behavior. ir_generate_traces_tibble(),ir_generate_cycles_tibble(), andir_generate_scans_tibble()now also add acolorcolumn alongsidetrace. It groups every trace that shares a species and (numerator) mass into a single factor level labelled with all of them, so"CO2: 45"and"CO2: 45/44"both get"CO2: 45, 45/44". Its levels follow thetraceorder (ascending species/mass).ir_plot_traces(),ir_plot_dual_inlet(), andir_plot_scans()now map the colour aesthetic to thatcolorcolumn by default (previouslytrace). An intensity trace and its ratios are still drawn in the same colour and still as separate lines, but they now share **one** legend entry ("CO2: 45, 45/44") instead of appearing as separate entries with a repeated colour. Passcolor = traceto give every trace its own colour and legend entry.drop_unused_levelsnow applies at colour-group granularity: a group stays in the legend as long as any of its traces is visible, and keeps its full label.- New
ir_filter_masses(), which keeps only the requested masses in thetraces,cycles, andscansof a dataset. Whereir_filter_metadata()selects files, this selects masses, **tidyselect** syntax is allowed: ``r dataset |> ir_filter_masses(44:46) # the CO2 masses dataset |> ir_filter_masses(-"45") # all but mass 45`Any metadata record left without data afterwards is removed, and that removal cascades to the other datasets exactly as inir_filter_metadata(). Like the metadata operations it works on bothir_aggregated_data(fromir_aggregate_isofiles()) andir_isofiles(fromir_read_isofiles()) objects. The selection is resolved once against the whole object, so a mass that only some of the files or datasets contain is fine - the others simply end up without data.resistors` are not filtered by mass since they describe the instrument configuration rather than measured data. - Fixed the metadata operations (
ir_filter_metadata(),ir_mutate_metadata(),ir_join_metadata()) silently skipping thetraces,cycles, andscansof anir_isofilescollection that **mixes measurement types**. Since a dataset only some of the file types have isNULLin the other rows (e.g.tracesfor a dual inlet file), such a column was not recognized as a nested dataset at all, soir_filter_metadata()did not cascade its filter into it. Reading a single measurement type at a time was unaffected. - Fixed deprecation warnings from using the
.datapronoun in tidyselect expressions (e.g. inir_read_isofiles()). - Fixed
mass/ratioselections that mean "none" only being recognized when written as a literalNULL.c(), and any expression evaluating toNULL(e.g. a variable holding it, or an argument forwarded on with{{ }}), now behave identically: they select nothing, no longer error with "calculate ratios first" when theratio_name/ratiocolumns are absent, and no longer trigger tidyselect's "external vector in selections" deprecation warning. - Fixed the plotting functions and
ir_generate_*_tibble()erroring with "Can't combine..1$trace\<character\> and..2$trace\<logical\>" on data whoseratio_name/ratiocolumns are present but hold no ratios at all - for example afterir_calculate_ratios()on a species with only a single mass, where the one row is the base mass and itsratio_nameisNA. - Upgraded to
isoextractversion 0.3.2 to enable successful reading of files generated with Isodat systems that use a GC II-III Interface
From NEWS.md in the release
Install
Health
- OK13 OK2026-08-05
- NOTE12 OK, 1 NOTE2026-08-01
- OK8 OK2026-07-11
Documentation
- Help pages
- 28includes a package overview page
- Examples that run
- 67%4 run in a plain check · 1 only when donttest examples are enabled (R CMD check --as-cran) · 1 never run
- Exported functions with examples
- 24%
- Documented parameters
- 93%
- Return-value docs
- 100%
- Help pages citing references
- 0%
- Functionality Guide HTML
Downloads
Repository
- PRs merged (all time)
- 100%
- Median days to close, 50 most recently updated closed issues
- 3
- Median days to close, 50 most recently updated closed PRs
- 0
Releases over time
Issues over time
Commits over time
11 development-tooling and community-health practices detected across 5 families in the upstream repository
Checks run against github.com/isoverse/isoreader2 on 2026-10-21.
The R CMD check workflow runs on Linux, macOS and Windows
GitHub Pages site last deployed 2026-09-07 · The repository has a site deploy workflow
pkgdown site last built 2026-09-07
Show all practicesHide 1 practice
Dependencies
Installing isoreader2 adds 49 packages (27 with compiled code, 37 MB of source tarballs). Heaviest: stringi 11 MB, ggplot2 6.0 MB, RcppSimdJson 3.2 MB.
Code & Tests
People & History
Pick two releases to compare their code metrics.
- 0.7.0Latest
- 0.6.12026-07-10
- RR 4.6.0 released · 2026-04-24
Package metadata
- First published
- 2026-07-10
- Total releases
- 2 / 1 yrs
- License
- AGPL (>= 3) OSI
- Minimum R
- ≥ 4.5.0
- Download size
- 4.3 MB
Cite
Cite this package
Run in R for the authors' entry:
citation("isoreader2")The package provides a citation file, so citation() returns the authors' own entry.
It points to 10.21105/joss.02878.
Cite the R Observatory
For a number measured here: a download total, a coverage figure, an archival date.
From data release v2026-10-25, which the citation names so these numbers can be found later. More on citing and the projects behind them.