| Title: | OmicsLake: Versioned, On-Disk Omics Data Management for Bioconductor |
|---|---|
| Description: | A lightweight framework for versioned, on-disk omics data management using DuckDB, Arrow, and Parquet. It provides read/write-style functions, snapshots, and version-aware dataset lineage for tracked or explicitly annotated workflows. Adapters preserve supported Bioconductor containers, including SummarizedExperiment and MultiAssayExperiment, while retaining queryable tabular components. |
| Authors: | Yusuke Matsui [aut, cre] |
| Maintainer: | Yusuke Matsui <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.99.3 |
| Built: | 2026-07-15 15:17:53 UTC |
| Source: | https://github.com/BiocStaging/OmicsLake |
A lightweight framework for versioned, on-disk omics data management using DuckDB + Arrow + Parquet. Provides simple read/write-style functions and Bioconductor-compatible readers (SummarizedExperiment, MultiAssayExperiment).
Maintainer: Yusuke Matsui [email protected] (ORCID)
Useful links:
Report bugs at https://github.com/matsui-lab/OmicsLake/issues
Use this operator at the end of a pipe to save results to a lake. Format: data
.data %>>% target.data %>>% target
.data |
Data from pipe |
target |
Target specification ("name" or "project/name") |
Invisibly returns the data
if (FALSE) { use_lake("my_project") df |> dplyr::filter(x > 5) %>>% "filtered_data" }if (FALSE) { use_lake("my_project") df |> dplyr::filter(x > 5) %>>% "filtered_data" }
BETWEEN operator for range filtering
x %between% rangex %between% range
x |
Numeric vector |
range |
Numeric vector of length 2 (min, max), inclusive |
Logical vector
values <- 1:20 values[values %between% c(5, 15)]values <- 1:20 values[values %between% c(5, 15)]
Case-insensitive LIKE operator
x %ilike% patternx %ilike% pattern
x |
Character vector to match against |
pattern |
Pattern string (SQL LIKE syntax) |
Logical vector
names <- c("John", "JOHN", "johnny", "Jane") names[names %ilike% "john%"]names <- c("John", "JOHN", "johnny", "Jane") names[names %ilike% "john%"]
Case-insensitive regex match
x %iregex% patternx %iregex% pattern
x |
Character vector |
pattern |
Regular expression pattern |
Logical vector
genes <- c("ENSG001", "ensg002", "MT-CO1") genes[genes %iregex% "^ensg"]genes <- c("ENSG001", "ensg002", "MT-CO1") genes[genes %iregex% "^ensg"]
Matches patterns using SQL LIKE syntax where: - ' - '_' matches any single character
x %like% patternx %like% pattern
x |
Character vector to match against |
pattern |
Pattern string (SQL LIKE syntax) |
Logical vector
genes <- c("MT-CO1", "MT-CO2", "ACTB", "GAPDH") genes[genes %like% "MT-%"]genes <- c("MT-CO1", "MT-CO2", "ACTB", "GAPDH") genes[genes %like% "MT-%"]
Regex match operator
x %regex% patternx %regex% pattern
x |
Character vector |
pattern |
Regular expression pattern |
Logical vector
genes <- c("ENSG00000001", "ENSG00000002", "MT-CO1") genes[genes %regex% "^ENSG"]genes <- c("ENSG00000001", "ENSG00000002", "MT-CO1") genes[genes %regex% "^ENSG"]
Adapter for storing and retrieving ATAC-layer objects.
Supports explicit ATAC marker classes/metadata and ChromatinAssay objects.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> ATACAdapter
name()
ATACAdapter$name()
priority()
ATACAdapter$priority()
put()
ATACAdapter$put(lake, name, data)
get()
ATACAdapter$get(lake, name, ref = "@latest")
components()
ATACAdapter$components(lake, name)
exists()
ATACAdapter$exists(lake, name)
list_names()
ATACAdapter$list_names(lake)
can_handle()
ATACAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
ATACAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- ATACAdapter$new() class(adapter)adapter <- ATACAdapter$new() class(adapter)
Adapter for storing and retrieving ChIP-layer objects.
Supports explicit ChIP marker classes/metadata.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> ChIPAdapter
name()
ChIPAdapter$name()
priority()
ChIPAdapter$priority()
put()
ChIPAdapter$put(lake, name, data)
get()
ChIPAdapter$get(lake, name, ref = "@latest")
components()
ChIPAdapter$components(lake, name)
exists()
ChIPAdapter$exists(lake, name)
list_names()
ChIPAdapter$list_names(lake)
can_handle()
ChIPAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
ChIPAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- ChIPAdapter$new() class(adapter)adapter <- ChIPAdapter$new() class(adapter)
Adapter for storing and retrieving
Chromatograms objects.
This adapter currently guarantees full-fidelity roundtrip by storing the complete object and manifest as internal components.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> ChromatogramsAdapter
name()
ChromatogramsAdapter$name()
can_handle()
ChromatogramsAdapter$can_handle(data)
priority()
ChromatogramsAdapter$priority()
put()
ChromatogramsAdapter$put(lake, name, data)
get()
ChromatogramsAdapter$get(lake, name, ref = "@latest")
components()
ChromatogramsAdapter$components(lake, name)
exists()
ChromatogramsAdapter$exists(lake, name)
list_names()
ChromatogramsAdapter$list_names(lake)
clone()
The objects of this class are cloneable with this method.
ChromatogramsAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- ChromatogramsAdapter$new() class(adapter)adapter <- ChromatogramsAdapter$new() class(adapter)
Thin wrapper around dplyr::coalesce() re-exported for convenience.
Note: this will mask dplyr::coalesce when both packages are loaded.
coalesce(...)coalesce(...)
... |
Vectors to coalesce |
Vector with first non-NA values
x <- c(NA, 2, NA) y <- c(1, NA, 3) coalesce(x, y) # Returns c(1, 2, 3)x <- c(NA, 2, NA) y <- c(1, NA, 3) coalesce(x, y) # Returns c(1, 2, 3)
Check if string contains a substring
contains_str(x, substring)contains_str(x, substring)
x |
Character vector |
substring |
Substring to search for |
Logical vector
text <- c("hello world", "goodbye", "hello there") text[contains_str(text, "hello")]text <- c("hello world", "goodbye", "hello there") text[contains_str(text, "hello")]
Defines a sequence of operations that will be tracked as a unit.
create_pipeline(lake, name)create_pipeline(lake, name)
lake |
Lake instance |
name |
Name for this pipeline |
A Pipeline object
if (FALSE) { lake <- Lake$new("project") pipeline <- create_pipeline(lake, "preprocessing") pipeline$ step("load", function() read.csv("data.csv"))$ step("clean", function(data) na.omit(data))$ step("normalize", function(data) scale(data))$ run() # All steps are recorded in lineage lake$tree("preprocessing.normalize") }if (FALSE) { lake <- Lake$new("project") pipeline <- create_pipeline(lake, "preprocessing") pipeline$ step("load", function() read.csv("data.csv"))$ step("clean", function(data) na.omit(data))$ step("normalize", function(data) scale(data))$ run() # All steps are recorded in lineage lake$tree("preprocessing.normalize") }
Get dependencies from the default lake
deps(name, direction = "up")deps(name, direction = "up")
name |
Data name |
direction |
"up" or "down" |
Dependencies data frame
use_lake("ex_deps", root = tempfile()) put("raw", data.frame(x = 1:3)) deps("raw")use_lake("ex_deps", root = tempfile()) put("raw", data.frame(x = 1:3)) deps("raw")
Make Lake work seamlessly with dplyr pipelines. Automatically tracks dependencies through dplyr operations.
See the individual function help pages for return values.
if (FALSE) { lake <- Lake$new("my_project") # Dependencies are automatically tracked through the pipe lake$ref("counts") |> dplyr::filter(quality > 0.8) |> dplyr::left_join(lake$ref("metadata"), by = "sample_id") |> dplyr::group_by(condition) |> dplyr::summarize(mean_expr = mean(expression)) |> save_as("summary", lake) }if (FALSE) { lake <- Lake$new("my_project") # Dependencies are automatically tracked through the pipe lake$ref("counts") |> dplyr::filter(quality > 0.8) |> dplyr::left_join(lake$ref("metadata"), by = "sample_id") |> dplyr::group_by(condition) |> dplyr::summarize(mean_expr = mean(expression)) |> save_as("summary", lake) }
Drop data from the default lake
drop(name, ...)drop(name, ...)
name |
Data name |
... |
Additional arguments passed to Lake$drop() |
Invisible Lake object
use_lake("ex_drop", root = tempfile()) put("t", data.frame(x = 1:3)) drop("t")use_lake("ex_drop", root = tempfile()) put("t", data.frame(x = 1:3)) drop("t")
Check if string ends with a suffix
ends_with_str(x, suffix)ends_with_str(x, suffix)
x |
Character vector |
suffix |
Suffix to check for |
Logical vector
files <- c("a.csv", "b.txt", "c.csv") files[ends_with_str(files, ".csv")]files <- c("a.csv", "b.txt", "c.csv") files[ends_with_str(files, ".csv")]
Adapter for storing and retrieving epigenomics-layer objects.
This umbrella adapter is lower priority than specific adapters (e.g. Methylation / ATAC / ChIP) and captures epigenomics-marked objects.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> EpigenomicsAdapter
name()
EpigenomicsAdapter$name()
priority()
EpigenomicsAdapter$priority()
put()
EpigenomicsAdapter$put(lake, name, data)
get()
EpigenomicsAdapter$get(lake, name, ref = "@latest")
components()
EpigenomicsAdapter$components(lake, name)
exists()
EpigenomicsAdapter$exists(lake, name)
list_names()
EpigenomicsAdapter$list_names(lake)
can_handle()
EpigenomicsAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
EpigenomicsAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- EpigenomicsAdapter$new() class(adapter)adapter <- EpigenomicsAdapter$new() class(adapter)
Benchmark workloads W0-W2 for OmicsLake evaluation
'NULL'. This topic documents internal evaluation helpers.
RNA-seq case study demonstrating reproducibility features
'NULL'. This topic documents internal evaluation helpers.
Functions for generating synthetic datasets for benchmarking
'NULL'. This topic documents internal evaluation helpers.
Functions for configuration loading, metrics collection, and result output
'NULL'. This topic documents internal evaluation helpers.
Functions for generating evaluation figures
'NULL'. This topic documents internal evaluation helpers.
Export data from the default lake
export_data(name, path, ...)export_data(name, path, ...)
name |
Data name to export |
path |
Output file path |
... |
Additional arguments |
Invisible path
use_lake("ex_export", root = tempfile()) put("t", data.frame(x = 1:3)) export_data("t", file.path(tempdir(), "t.parquet"))use_lake("ex_export", root = tempfile()) put("t", data.frame(x = 1:3)) export_data("t", file.path(tempdir(), "t.parquet"))
Note: This function is named 'fetch' to avoid conflict with base::get()
fetch(name, ...)fetch(name, ...)
name |
Name of the data to read |
... |
Additional arguments passed to Lake$get() |
The requested data
use_lake("ex_fetch", root = tempfile()) put("counts", data.frame(gene = c("A", "B"), value = c(1, 2))) fetch("counts")use_lake("ex_fetch", root = tempfile()) put("counts", data.frame(gene = c("A", "B"), value = c(1, 2))) fetch("counts")
Start a query from a table on the default lake
from(table)from(table)
table |
Table name |
A QueryBuilder instance
use_lake("ex_from", root = tempfile()) put("t", data.frame(x = 1:3)) qb <- from("t")use_lake("ex_from", root = tempfile()) put("t", data.frame(x = 1:3)) qb <- from("t")
Adapter for storing and retrieving genomics-layer objects.
This umbrella adapter is lower priority than specific adapters (e.g. VCF / RaggedExperiment) and captures genomics-marked objects.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> GenomicsAdapter
name()
GenomicsAdapter$name()
priority()
GenomicsAdapter$priority()
put()
GenomicsAdapter$put(lake, name, data)
get()
GenomicsAdapter$get(lake, name, ref = "@latest")
components()
GenomicsAdapter$components(lake, name)
exists()
GenomicsAdapter$exists(lake, name)
list_names()
GenomicsAdapter$list_names(lake)
can_handle()
GenomicsAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
GenomicsAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- GenomicsAdapter$new() class(adapter)adapter <- GenomicsAdapter$new() class(adapter)
Get registered adapters
get_adapters()get_adapters()
List of registered adapters
adapters <- get_adapters() length(adapters)adapters <- get_adapters() length(adapters)
Adapter for storing and retrieving glycomics-layer objects.
Supports explicit glycomics marker classes/metadata.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> GlycomicsAdapter
name()
GlycomicsAdapter$name()
priority()
GlycomicsAdapter$priority()
put()
GlycomicsAdapter$put(lake, name, data)
get()
GlycomicsAdapter$get(lake, name, ref = "@latest")
components()
GlycomicsAdapter$components(lake, name)
exists()
GlycomicsAdapter$exists(lake, name)
list_names()
GlycomicsAdapter$list_names(lake)
can_handle()
GlycomicsAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
GlycomicsAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- GlycomicsAdapter$new() class(adapter)adapter <- GlycomicsAdapter$new() class(adapter)
Show history from the default lake
history(name = NULL, ...)history(name = NULL, ...)
name |
Optional data name |
... |
Additional arguments passed to Lake$history() |
History data frame
use_lake("ex_history", root = tempfile()) put("t", data.frame(x = 1:3)) history()use_lake("ex_history", root = tempfile()) put("t", data.frame(x = 1:3)) history()
If-else with NA handling
if_else_na(condition, true, false, na = NA)if_else_na(condition, true, false, na = NA)
condition |
Logical vector |
true |
Value when TRUE |
false |
Value when FALSE |
na |
Value when NA (default: NA) |
Vector with conditional values
cond <- c(TRUE, FALSE, NA) if_else_na(cond, "yes", "no", na = "missing")cond <- c(TRUE, FALSE, NA) if_else_na(cond, "yes", "no", na = "missing")
Import data into the default lake
import_data(path, name, ...)import_data(path, name, ...)
path |
File path to import |
name |
Name to store as |
... |
Additional arguments |
Invisible Lake object
use_lake("ex_import", root = tempfile()) f <- file.path(tempdir(), "imp.csv") write.csv(data.frame(x = 1:3), f, row.names = FALSE) import_data(f, "imported")use_lake("ex_import", root = tempfile()) f <- file.path(tempdir(), "imp.csv") write.csv(data.frame(x = 1:3), f, row.names = FALSE) import_data(f, "imported")
Creates a function that can be used at the end of a pipe to save data.
into(lake)into(lake)
lake |
Lake instance |
A function that accepts data and name, saves to lake
if (FALSE) { write_to <- into(lake) df |> dplyr::filter(x > 5) |> write_to("filtered_data") }if (FALSE) { write_to <- into(lake) df |> dplyr::filter(x > 5) |> write_to("filtered_data") }
Check for non-NULL/non-NA values
is_not_null(x)is_not_null(x)
x |
Vector to check |
Logical vector indicating non-NA values
x <- c(1, NA, 3, NA, 5) x[is_not_null(x)]x <- c(1, NA, 3, NA, 5) x[is_not_null(x)]
Check for NULL/NA values
is_null(x)is_null(x)
x |
Vector to check |
Logical vector indicating NA values
x <- c(1, NA, 3, NA, 5) x[is_null(x)]x <- c(1, NA, 3, NA, 5) x[is_null(x)]
Get the current default lake
lake()lake()
The default Lake object
use_lake("ex_lake", root = tempfile()) l <- lake() l$put("data", data.frame(x = 1:3))use_lake("ex_lake", root = tempfile()) l <- lake() l$put("data", data.frame(x = 1:3))
R6 class for versioned, lineage-tracked data management. Provides a modern, fluent API for data operations with automatic dependency tracking.
A Lake R6 generator; call Lake$new() to create a lake.
SummarizedExperiment objects are stored via the SEAdapter pattern, which decomposes the object into queryable components:
Assays are stored as tables (long format for efficient querying)
colData and rowData are stored as separate tables
Metadata is stored as a serialized R object
When you put() a SummarizedExperiment, all components are stored
atomically within a transaction. When you tag() an SE object, all
components are tagged together to maintain version consistency.
Legacy objects stored before the adapter registry are still readable via fallback detection.
Tables: data.frames stored in DuckDB (queryable with SQL/dplyr)
Objects: Arbitrary R objects serialized with qs/RDS
SummarizedExperiment: Decomposed storage via SEAdapter
new()
Initialize a Lake project
Lake$new(project = NULL, backend = "duckdb", auto_track = TRUE, root = NULL)
projectProject name or path. If NULL, auto-generates a name.
backendStorage backend (currently only "duckdb" supported)
auto_trackEnable automatic dependency tracking (default: TRUE)
rootRoot directory for lake storage (default: ~/.omicslake)
A new Lake object
put()
Write data to the lake
Lake$put(name, data, depends_on = NULL, tags = NULL)
nameName for the data
dataData to store (data.frame, matrix, list, or any R object)
depends_onOptional explicit dependencies. Can be: - Character vector of names (uses @latest for all) - List of lists with 'name' and 'ref' elements for version-aware deps
**Auto-tracking note**: When 'auto_track=TRUE' (default), dependencies are automatically detected from: 1. 'lake_deps' attribute on data (set by 'save_as()' from dplyr pipes) 2. Tracked reads within a 'with_tracking()' or 'wrap_fn()' context
A simple 'lake$get()' followed by 'lake$put()' does NOT auto-capture dependencies. Use 'save_as()', 'with_tracking()', or specify 'depends_on'.
tagsOptional tags for this version
Invisible self for chaining
get()
Read data from the lake
Lake$get(name, ref = "@latest", where = NULL, select = NULL, collect = TRUE)
nameName of the data to read
refVersion reference ("@latest", "@first", "@tag(name)", or timestamp)
whereFilter condition (formula, e.g., ~ col > 5)
selectColumns to select (character vector)
collectWhether to collect results immediately (FALSE returns lazy reference)
The requested data
ref()
Get a lazy reference for dplyr operations
Lake$ref(name, ref = "@latest")
nameTable name
refVersion reference (default: "@latest")
A lazy table reference (tbl_lazy)
snap()
Create a project-wide snapshot
Lake$snap(label, note = "", params = list())
labelLabel for this snapshot
noteOptional description
paramsOptional parameters to store with the snapshot
Invisible self for chaining
tag()
Tag a specific data version
Lake$tag(name, tag)
nameData name
tagTag to apply
Invisible self for chaining
restore()
Restore project to a labeled snapshot
Lake$restore(label)
labelSnapshot label to restore
Invisible self for chaining
diff()
Compare two versions of data
Lake$diff(name, ref1 = "@latest", ref2 = "@first")
nameData name
ref1First version reference (default: "@latest")
ref2Second version reference (default: "@first")
Comparison summary with row counts, column differences, and sample data
tree()
Show lineage tree
Lake$tree(name = NULL, direction = "up", depth = 10)
nameStarting node (NULL for all)
direction"up" (ancestors), "down" (descendants), or "both"
depthMaximum depth to traverse
Data frame of lineage relationships
plot()
Plot lineage graph
Lake$plot(name = NULL, direction = "both")
nameStarting node (NULL for full graph)
direction"up", "down", or "both"
Lineage plot (requires igraph)
deps()
Get direct dependencies
Lake$deps(name, direction = "up")
nameData name
direction"up" (parents) or "down" (children)
Data frame of dependencies
impact()
Analyze impact of changing a data source
Lake$impact(name)
nameData name to analyze
Data frame of affected downstream data
query()
Start a query builder chain
Lake$query()
A new QueryBuilder instance
from()
Shortcut to start query from a table
Lake$from(table)
tableTable name
A QueryBuilder instance with FROM clause set
join()
Join two tables
Lake$join(left, right, by = NULL, type = "left")
leftLeft table name
rightRight table name
byJoin columns (character vector or named vector for different column names)
typeJoin type ("left", "inner", "right", "full")
Joined data
count()
Count rows, optionally grouped
Lake$count(table, ...)
tableTable name
...Grouping variables (unquoted)
Data frame with counts
mean()
Calculate mean of a column
Lake$mean(table, col, ...)
tableTable name
colColumn to average (unquoted)
...Grouping variables (unquoted)
Data frame with means
tables()
List all tables in the lake
Lake$tables()
Data frame of table names
objects()
List all objects in the lake
Lake$objects()
Data frame of object names
ls()
List all data (tables and objects)
Lake$ls()
List with tables and objects data frames
snaps()
List all snapshots/labels
Lake$snaps()
Data frame of snapshots
log()
Show history/log
Lake$log(name = NULL, n = 20)
nameOptional data name (NULL for project history)
nMaximum number of entries to return
Data frame of history entries
history()
Alias for log
Lake$history(name = NULL, n = 20)
nameOptional data name
nMaximum number of entries
Data frame of history entries
drop()
Remove data from the lake
Lake$drop(name, force = FALSE)
nameData name
forceForce removal even if has dependents
Invisible self for chaining
rm()
Alias for drop
Lake$rm(name, force = FALSE)
nameData name
forceForce removal
Invisible self for chaining
export()
Export data to a file
Lake$export(name, path, format = NULL)
nameData name
pathOutput file path
formatOutput format ("parquet", "csv", "rds"). Auto-detected from extension if NULL.
Invisible path
import()
Import external data into the lake
Lake$import(path, name, format = NULL)
pathInput file path
nameName to store as
formatInput format (auto-detected from extension if NULL)
Invisible self for chaining
sql()
Execute raw SQL query
Lake$sql(query, collect = TRUE)
querySQL query string
collectWhether to collect results immediately
Query results
q()
Alias for sql
Lake$q(query, collect = TRUE)
querySQL query string
collectWhether to collect results
Query results
[()
Bracket access for reading data
Lake$[(name, i, j)
nameData name
iRow filter expression (optional)
jColumn selection (optional)
Filtered/selected data
[<-()
Bracket assignment for writing data
Lake$[<-(name, value)
nameData name
valueData to store
print()
Print lake summary
Lake$print()
exists()
Check whether a data name exists in the lake
Lake$exists(name, type = c("any", "table", "object"))nameData name
typeOne of "any", "table", or "object"
TRUE/FALSE
find()
Find data names matching a pattern
Lake$find(
pattern = NULL,
type = c("any", "table", "object"),
ignore.case = TRUE,
fixed = FALSE,
fuzzy = TRUE,
max_distance = 3L,
min_score = -Inf,
prefer_type = c("none", "table", "object"),
limit = Inf
)patternOptional regex pattern; NULL returns all names
typeOne of "any", "table", or "object"
ignore.caseWhether matching should ignore case
Data frame with columns name, type
status()
One-line status summary for this lake
Lake$status()
A one-row data frame with status fields
doctor()
Run diagnostic checks on this lake
Lake$doctor(verbose = TRUE)
verboseIf TRUE, print a readable report
Data frame with columns check, ok, detail
repair()
Run the repair workflow on this lake
Lake$repair(...)
...Arguments forwarded to the repair implementation
Repair report (invisibly)
finalize()
Clean up connections when object is garbage collected
Lake$finalize()
if (FALSE) { # Initialize a lake lake <- Lake$new("my_project") # Store and retrieve data lake$put("counts", counts_df) data <- lake$get("counts") # Filter with formula syntax filtered <- lake$get("counts", where = ~ expression > 100) # Use with dplyr lake$ref("counts") |> dplyr::filter(quality > 0.8) |> dplyr::collect() # Version control lake$snap("v1.0") lake$tag("counts", "raw") lake$restore("v1.0") # View lineage lake$tree("results") # SummarizedExperiment storage library(SummarizedExperiment) se <- SummarizedExperiment(assays = list(counts = matrix(1:100, 10, 10))) lake$put("my_experiment", se) lake$tag("my_experiment", "v1") se_retrieved <- lake$get("my_experiment", ref = "@tag(v1)") }if (FALSE) { # Initialize a lake lake <- Lake$new("my_project") # Store and retrieve data lake$put("counts", counts_df) data <- lake$get("counts") # Filter with formula syntax filtered <- lake$get("counts", where = ~ expression > 100) # Use with dplyr lake$ref("counts") |> dplyr::filter(quality > 0.8) |> dplyr::collect() # Version control lake$snap("v1.0") lake$tag("counts", "raw") lake$restore("v1.0") # View lineage lake$tree("results") # SummarizedExperiment storage library(SummarizedExperiment) se <- SummarizedExperiment(assays = list(counts = matrix(1:100, 10, 10))) lake$put("my_experiment", se) lake$tag("my_experiment", "v1") se_retrieved <- lake$get("my_experiment", ref = "@tag(v1)") }
Consistent, memorable aliases that follow one naming rule: use 'lake_<verb>' for common operations.
lake_use(project = NULL, ...) lake_put(name, data, ...) lake_get(name, ...) lake_ref(name) lake_snap(label, ...) lake_tag(name, tag) lake_tree(name = NULL, ...) lake_has(name, type = c("any", "table", "object")) lake_track(expr, ...) lake_track_script(path, ...) lake_auto_on(...) lake_auto_off(commit = TRUE) lake_strict_on(...)lake_use(project = NULL, ...) lake_put(name, data, ...) lake_get(name, ...) lake_ref(name) lake_snap(label, ...) lake_tag(name, tag) lake_tree(name = NULL, ...) lake_has(name, type = c("any", "table", "object")) lake_track(expr, ...) lake_track_script(path, ...) lake_auto_on(...) lake_auto_off(commit = TRUE) lake_strict_on(...)
project |
Project name for the default lake |
... |
Additional arguments forwarded to the corresponding function |
name |
Data/table/node name (meaning depends on each function) |
data |
Data to store |
label |
Snapshot label |
tag |
Tag name |
type |
One of "any", "table", or "object" |
expr |
Expression to track |
path |
Script file path |
commit |
If TRUE, write tracked lineage before disabling transparent mode |
Each alias returns the value of the function it forwards to.
lake_use("ex_aliases", root = tempfile()) lake_put("counts", data.frame(x = 1:3)) lake_get("counts") lake_snap("v1")lake_use("ex_aliases", root = tempfile()) lake_put("counts", data.frame(x = 1:3)) lake_get("counts") lake_snap("v1")
Run diagnostics for the default lake (or a specified project)
lake_doctor(project = NULL, ..., verbose = TRUE)lake_doctor(project = NULL, ..., verbose = TRUE)
project |
Optional project name. If provided, checks that project directly. |
... |
Additional arguments passed to Lake$new() when project is provided. |
verbose |
If TRUE, print a readable report |
Data frame with diagnostic checks
use_lake("ex_doctor", root = tempfile()) put("t", data.frame(x = 1:3)) lake_doctor(verbose = FALSE)use_lake("ex_doctor", root = tempfile()) put("t", data.frame(x = 1:3)) lake_doctor(verbose = FALSE)
Check whether a data name exists in the default lake
lake_exists(name, type = c("any", "table", "object"))lake_exists(name, type = c("any", "table", "object"))
name |
Data name |
type |
One of "any", "table", or "object" |
TRUE/FALSE
use_lake("ex_exists", root = tempfile()) put("t", data.frame(x = 1:3)) lake_exists("t")use_lake("ex_exists", root = tempfile()) put("t", data.frame(x = 1:3)) lake_exists("t")
Find data names in the default lake
lake_find( pattern = NULL, type = c("any", "table", "object"), ignore.case = TRUE, fixed = FALSE, fuzzy = TRUE, max_distance = 3L, min_score = -Inf, prefer_type = c("none", "table", "object"), limit = Inf )lake_find( pattern = NULL, type = c("any", "table", "object"), ignore.case = TRUE, fixed = FALSE, fuzzy = TRUE, max_distance = 3L, min_score = -Inf, prefer_type = c("none", "table", "object"), limit = Inf )
pattern |
Optional regex/fixed pattern; NULL returns all names |
type |
One of "any", "table", or "object" |
ignore.case |
Whether matching should ignore case |
fixed |
Whether to treat pattern as fixed string |
fuzzy |
Whether to include fuzzy matches when exact/regex matching misses |
max_distance |
Maximum edit distance for fuzzy matches |
min_score |
Minimum score threshold for returned candidates |
prefer_type |
Optional type priority in tie-breaks: "none", "table", or "object" |
limit |
Maximum number of rows to return (Inf for all) |
Data frame with columns name, type, score, distance, and match_type
use_lake("ex_find", root = tempfile()) put("counts", data.frame(x = 1:3)) lake_find("count")use_lake("ex_find", root = tempfile()) put("counts", data.frame(x = 1:3)) lake_find("count")
Runs a five-step workflow: 1) situation summary, 2) cause identification, 3) fix proposals, 4) optional auto-execution, and 5) before/after comparison.
lake_repair( target = NULL, restore_label = NULL, auto = FALSE, enable_strict = FALSE, strict_path = getOption("ol.repro.path", getwd()), renv_restore = FALSE, numeric_tolerance = 1e-08, ignore_row_order = TRUE, verbose = TRUE )lake_repair( target = NULL, restore_label = NULL, auto = FALSE, enable_strict = FALSE, strict_path = getOption("ol.repro.path", getwd()), renv_restore = FALSE, numeric_tolerance = 1e-08, ignore_row_order = TRUE, verbose = TRUE )
target |
Optional data name to focus lineage diagnostics |
restore_label |
Optional snapshot label used for rollback proposals |
auto |
If TRUE, execute auto-supported proposals |
enable_strict |
If TRUE, enable strict reproducibility mode during auto execution |
strict_path |
Path used when enabling strict reproducibility mode |
renv_restore |
If TRUE, run renv::restore() during auto execution |
numeric_tolerance |
Numeric tolerance used for semantic value comparison |
ignore_row_order |
If TRUE, compare tabular targets ignoring row order |
verbose |
If TRUE, print the five-step report |
A lake_repair_report object
use_lake("ex_lake_repair", root = tempfile()) put("t", data.frame(x = 1:3)) lake_repair()use_lake("ex_lake_repair", root = tempfile()) put("t", data.frame(x = 1:3)) lake_repair()
Show one-line status for the default lake (or a specified project)
lake_status(project = NULL, ...)lake_status(project = NULL, ...)
project |
Optional project name. If provided, checks that project directly. |
... |
Additional arguments passed to Lake$new() when project is provided. |
One-row data frame with status fields
use_lake("ex_status", root = tempfile()) put("t", data.frame(x = 1:3)) lake_status()use_lake("ex_status", root = tempfile()) put("t", data.frame(x = 1:3)) lake_status()
Base class for type-specific data adapters. Adapters provide specialized storage and retrieval for complex object types.
Adapters allow OmicsLake to store complex objects (like SummarizedExperiment or Seurat objects) in a structured way that preserves all metadata and allows partial queries.
A LakeAdapter R6 generator (base class for type adapters).
name()
Get the adapter name
LakeAdapter$name()
Character string
can_handle()
Check if this adapter can handle the given data
LakeAdapter$can_handle(data)
dataData to check
Logical indicating if adapter can handle this type
priority()
Get the priority of this adapter (higher = checked first)
LakeAdapter$priority()
Numeric priority value
put()
Store data using this adapter
LakeAdapter$put(lake, name, data)
lakeLake instance
nameData name
dataData to store
Invisible TRUE on success
get()
Retrieve data using this adapter
LakeAdapter$get(lake, name, ref = "@latest")
lakeLake instance
nameData name
refVersion reference
The retrieved data
components()
List components stored for this data
LakeAdapter$components(lake, name)
lakeLake instance
nameData name
Data frame of components
exists()
Check if data exists
LakeAdapter$exists(lake, name)
lakeLake instance
nameData name
Logical
list_names()
List root names managed by this adapter
LakeAdapter$list_names(lake)
lakeLake instance
Character vector of names
clone()
The objects of this class are cloneable with this method.
LakeAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
if (FALSE) { # Register a custom adapter my_adapter <- MyAdapter$new() register_adapter(my_adapter) # Now Lake will use this adapter for matching types lake$put("my_data", my_special_object) }if (FALSE) { # Register a custom adapter my_adapter <- MyAdapter$new() register_adapter(my_adapter) # Now Lake will use this adapter for matching types lake$put("my_data", my_special_object) }
Manually creates a dependency relationship between two nodes in the lineage graph.
link(from, to, lake = NULL, relationship = "linked")link(from, to, lake = NULL, relationship = "linked")
from |
Source node name (parent) |
to |
Target node name (child) |
lake |
Lake instance (uses default if NULL) |
relationship |
Type of relationship (default: "linked") |
Invisible TRUE on success
if (FALSE) { lake <- Lake$new("project") # Store some data lake$put("source_data", df1) lake$put("derived_data", df2) # Manually link them link("source_data", "derived_data", lake) # Now lineage shows the connection lake$tree("derived_data") }if (FALSE) { lake <- Lake$new("project") # Store some data lake$put("source_data", df1) lake$put("derived_data", df2) # Manually link them link("source_data", "derived_data", lake) # Now lineage shows the connection lake$tree("derived_data") }
Adapter for storing and retrieving lipidomics-layer objects.
Supports explicit lipidomics marker classes/metadata.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> LipidomicsAdapter
name()
LipidomicsAdapter$name()
priority()
LipidomicsAdapter$priority()
put()
LipidomicsAdapter$put(lake, name, data)
get()
LipidomicsAdapter$get(lake, name, ref = "@latest")
components()
LipidomicsAdapter$components(lake, name)
exists()
LipidomicsAdapter$exists(lake, name)
list_names()
LipidomicsAdapter$list_names(lake)
can_handle()
LipidomicsAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
LipidomicsAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- LipidomicsAdapter$new() class(adapter)adapter <- LipidomicsAdapter$new() class(adapter)
Adapter for storing and retrieving
MultiAssayExperiment objects.
This adapter preserves MultiAssayExperiment components:
experiments (experiments)
sample map (sampleMap)
participant metadata (colData)
dropped samples (drops)
object metadata (metadata)
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> MAEAdapter
name()
MAEAdapter$name()
can_handle()
MAEAdapter$can_handle(data)
priority()
MAEAdapter$priority()
put()
MAEAdapter$put(lake, name, data)
get()
MAEAdapter$get(lake, name, ref = "@latest")
components()
MAEAdapter$components(lake, name)
exists()
MAEAdapter$exists(lake, name)
list_names()
MAEAdapter$list_names(lake)
clone()
The objects of this class are cloneable with this method.
MAEAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- MAEAdapter$new() class(adapter)adapter <- MAEAdapter$new() class(adapter)
Creates a node in the lineage graph without actually storing any data. Useful for tracking external files or intermediate calculations.
mark(name, data = NULL, lake = NULL)mark(name, data = NULL, lake = NULL)
name |
Node name in the lineage graph |
data |
Optional data to extract metadata from (not stored).
Use a character scalar for file path/URL, or a named list with fields like
|
lake |
Lake instance (uses default if NULL) |
Invisibly returns the data (for piping)
if (FALSE) { lake <- Lake$new("project") # Mark an external file in the lineage mark("external_data.csv", lake = lake) # Mark with metadata extraction large_matrix <- matrix(1:1000000, 1000, 1000) mark("large_computation", large_matrix, lake) # Only metadata is recorded, not the actual data }if (FALSE) { lake <- Lake$new("project") # Mark an external file in the lineage mark("external_data.csv", lake = lake) # Mark with metadata extraction large_matrix <- matrix(1:1000000, 1000, 1000) mark("large_computation", large_matrix, lake) # Only metadata is recorded, not the actual data }
Adapter for storing and retrieving metabolomics-layer objects.
Supports explicit metabolomics marker classes/metadata.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> MetabolomicsAdapter
name()
MetabolomicsAdapter$name()
priority()
MetabolomicsAdapter$priority()
put()
MetabolomicsAdapter$put(lake, name, data)
get()
MetabolomicsAdapter$get(lake, name, ref = "@latest")
components()
MetabolomicsAdapter$components(lake, name)
exists()
MetabolomicsAdapter$exists(lake, name)
list_names()
MetabolomicsAdapter$list_names(lake)
can_handle()
MetabolomicsAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
MetabolomicsAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- MetabolomicsAdapter$new() class(adapter)adapter <- MetabolomicsAdapter$new() class(adapter)
Adapter for storing and retrieving methylation-layer objects.
Supports common Bioconductor methylation classes (e.g. minfi family) by storing a full serialized object and manifest.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> MethylationAdapter
name()
MethylationAdapter$name()
priority()
MethylationAdapter$priority()
put()
MethylationAdapter$put(lake, name, data)
get()
MethylationAdapter$get(lake, name, ref = "@latest")
components()
MethylationAdapter$components(lake, name)
exists()
MethylationAdapter$exists(lake, name)
list_names()
MethylationAdapter$list_names(lake)
can_handle()
MethylationAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
MethylationAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- MethylationAdapter$new() class(adapter)adapter <- MethylationAdapter$new() class(adapter)
Adapter for storing and retrieving
MsExperiment objects.
This adapter preserves MsExperiment components:
sample metadata (sampleData)
spectra (spectra)
quantitative/assay data (qdata)
experiment files (experimentFiles)
auxiliary data (otherData)
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> MsExperimentAdapter
name()
MsExperimentAdapter$name()
can_handle()
MsExperimentAdapter$can_handle(data)
priority()
MsExperimentAdapter$priority()
put()
MsExperimentAdapter$put(lake, name, data)
get()
MsExperimentAdapter$get(lake, name, ref = "@latest")
components()
MsExperimentAdapter$components(lake, name)
exists()
MsExperimentAdapter$exists(lake, name)
list_names()
MsExperimentAdapter$list_names(lake)
clone()
The objects of this class are cloneable with this method.
MsExperimentAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- MsExperimentAdapter$new() class(adapter)adapter <- MsExperimentAdapter$new() class(adapter)
NOT BETWEEN operator
x %!between% rangex %!between% range
x |
Numeric vector |
range |
Numeric vector of length 2 (min, max) |
Logical vector
values <- 1:20 values[values %!between% c(5, 15)]values <- 1:20 values[values %!between% c(5, 15)]
NOT IN operator
x %!in% tablex %!in% table
x |
Vector |
table |
Values to exclude |
Logical vector
letters[letters %!in% c("a", "e", "i", "o", "u")]letters[letters %!in% c("a", "e", "i", "o", "u")]
List objects in the default lake
objects()objects()
Data frame of object names
use_lake("ex_objects", root = tempfile()) put("model", list(a = 1, b = 2)) objects()use_lake("ex_objects", root = tempfile()) put("model", list(a = 1, b = 2)) objects()
Track file I/O operations without modifying existing code. Provides a non-invasive way to build lineage from existing workflows.
Executes code while tracking file reads and writes to build a lineage graph. This is useful for understanding data flow in existing scripts without modifying them.
observe(expr, track_functions = NULL)observe(expr, track_functions = NULL)
expr |
Expression or code block to observe |
track_functions |
Character vector of function names to intercept. 'NULL' uses common I/O defaults; 'character(0)' disables auto interception. |
Observation mode provides a framework for tracking file I/O operations.
By default, observe() now auto-tracks common unqualified I/O calls
(e.g. read.csv(), write.csv(), readRDS(),
saveRDS()).
## Limitations
Automatic interception is best-effort:
- Namespaced calls (e.g. utils::read.csv) are not intercepted
- I/O executed outside the observed R expression cannot be intercepted
- For unsupported functions, use record_read() / record_write()
## Recommended Approach
For reliable lineage tracking, use OmicsLake's native functions: - 'ol_write()' / 'ol_read()' for tables - 'ol_save()' / 'ol_read_object()' for R objects
These automatically track dependencies when 'depends_on' is specified.
## Manual Recording
For legacy code, use 'record_read()' and 'record_write()' within observe() to manually record file operations.
A list containing:
result |
The result of evaluating expr |
reads |
Character vector of files read |
writes |
Character vector of files written |
lineage |
Data frame of inferred dependencies |
if (FALSE) { # Manual recording within observe() lineage <- observe({ record_read("input.csv") data <- read.csv("input.csv") result <- transform(data) record_write("output.csv") write.csv(result, "output.csv") }) # View what was tracked print(lineage) } if (FALSE) { result <- observe({ data <- read.csv("data.csv") processed <- data[data$value > 0, ] write.csv(processed, "processed.csv") }) print(result$reads) # "data.csv" print(result$writes) # "processed.csv" print(result$lineage) # data.csv -> processed.csv }if (FALSE) { # Manual recording within observe() lineage <- observe({ record_read("input.csv") data <- read.csv("input.csv") result <- transform(data) record_write("output.csv") write.csv(result, "output.csv") }) # View what was tracked print(lineage) } if (FALSE) { result <- observe({ data <- read.csv("data.csv") processed <- data[data$value > 0, ] write.csv(processed, "processed.csv") }) print(result$reads) # "data.csv" print(result$writes) # "processed.csv" print(result$lineage) # data.csv -> processed.csv }
Starts an observation session that tracks all Lake operations until stopped.
observe_session(lake)observe_session(lake)
lake |
Lake instance to observe |
An ObserveSession object
if (FALSE) { lake <- Lake$new("project") session <- observe_session(lake) # Do work... lake$put("data1", df1) lake$put("data2", df2, depends_on = "data1") # Stop and get summary summary <- session$stop() print(summary) }if (FALSE) { lake <- Lake$new("project") session <- observe_session(lake) # Do work... lake$put("data1", df1) lake$put("data2", df2, depends_on = "data1") # Stop and get summary summary <- session$stop() print(summary) }
Executes code while tracking I/O, then records the lineage to a Lake.
observe_to_lake(expr, lake, prefix = "file:", track_functions = NULL)observe_to_lake(expr, lake, prefix = "file:", track_functions = NULL)
expr |
Expression to observe |
lake |
Lake instance to record lineage to |
prefix |
Prefix for file-based node names in the lake |
track_functions |
Character vector forwarded to 'observe()' |
The result of evaluating expr
if (FALSE) { lake <- Lake$new("my_project") observe_to_lake( { source("analysis_pipeline.R") }, lake = lake ) # View the recorded lineage lake$tree() }if (FALSE) { lake <- Lake$new("my_project") observe_to_lake( { source("analysis_pipeline.R") }, lake = lake ) # View the recorded lineage lake$tree() }
Add a ranking column using window functions (ROW_NUMBER, RANK, DENSE_RANK).
ol_add_rank( table, rank_by, partition_by = NULL, method = "row_number", descending = TRUE, as_column = "rank", project = getOption("ol.project"), collect = TRUE )ol_add_rank( table, rank_by, partition_by = NULL, method = "row_number", descending = TRUE, as_column = "rank", project = getOption("ol.project"), collect = TRUE )
table |
Character string, name of the table |
rank_by |
Character string, column name to rank by |
partition_by |
Character vector of columns to partition by (default: NULL) |
method |
Character, ranking method: "row_number", "rank", or "dense_rank" (default: "row_number") |
descending |
Logical; if TRUE, rank in descending order (default: TRUE) |
as_column |
Character, name of the ranking column to add (default: "rank") |
project |
Project name (default: current project) |
collect |
Logical; if TRUE returns data.frame, if FALSE returns lazy dplyr table |
Original table with added ranking column
if (FALSE) { ol_add_rank("genes", rank_by = "expression", method = "dense_rank") ol_add_rank("genes", rank_by = "expression", partition_by = "sample", as_column = "expression_rank" ) }if (FALSE) { ol_add_rank("genes", rank_by = "expression", method = "dense_rank") ol_add_rank("genes", rank_by = "expression", partition_by = "sample", as_column = "expression_rank" ) }
Calculate multiple aggregate statistics, optionally grouped by columns. Supports common aggregates: count, sum, avg, min, max, stddev, median, etc.
ol_aggregate( table, group_by = NULL, ..., project = getOption("ol.project"), collect = TRUE )ol_aggregate( table, group_by = NULL, ..., project = getOption("ol.project"), collect = TRUE )
table |
Character string, name of the table to aggregate |
group_by |
Character vector of column names to group by (default: NULL for overall aggregates) |
... |
Named arguments specifying aggregates. Each argument should be a list with 'func' (aggregate function name) and 'col' (column name). The argument name becomes the output column name. |
project |
Project name (default: current project) |
collect |
Logical; if TRUE returns data.frame, if FALSE returns lazy dplyr table |
Aggregated results as data.frame (if collect=TRUE) or lazy table (if collect=FALSE)
ol_init("ex_aggregate", root = tempfile()) ol_write("t", data.frame(g = c("a", "a", "b"), v = c(1, 2, 3))) ol_aggregate("t", group_by = "g", mean_v = list(func = "mean", col = "v"))ol_init("ex_aggregate", root = tempfile()) ol_write("t", data.frame(g = c("a", "a", "b"), v = c(1, 2, 3))) ol_aggregate("t", group_by = "g", mean_v = list(func = "mean", col = "v"))
Restore entire project to a labeled state
ol_checkout(label, project = getOption("ol.project"))ol_checkout(label, project = getOption("ol.project"))
label |
The label name to restore to |
project |
The project name |
Invisible TRUE on success, FALSE if no tables found
ol_init("ex_ol_checkout", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_label("v1") ol_checkout("v1")ol_init("ex_ol_checkout", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_label("v1") ol_checkout("v1")
Commit with metadata (note and parameters)
ol_commit(note = "", params = list(), project = getOption("ol.project"))ol_commit(note = "", params = list(), project = getOption("ol.project"))
note |
Commit message describing the changes |
params |
Named list of parameters to store with the commit |
project |
Project name |
By default, commits automatically embed reproducibility context under 'params$omicslake_repro' (Git state, 'renv.lock', and session/system metadata when available). Control this with: 'options(ol.repro.capture = TRUE/FALSE)', 'options(ol.repro.path = "/path/to/analysis")', 'options(ol.repro.include = c("git","renv","session","system"))', 'options(ol.repro.strict = TRUE/FALSE)', 'options(ol.repro.require_clean_git = TRUE/FALSE)', and AI metadata options such as 'options(ol.agent.prompt_id = "...")'.
Invisible commit identifier string
ol_init("ex_ol_commit", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_commit("initial load")ol_init("ex_ol_commit", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_commit("initial load")
Shows a side-by-side comparison of multiple versions of an object, including timestamps, tags, size changes, and dependency changes.
ol_compare_versions(name, versions = NULL, project = getOption("ol.project"))ol_compare_versions(name, versions = NULL, project = getOption("ol.project"))
name |
Name of the object to compare versions for |
versions |
Optional vector of version identifiers (timestamps or tags). If NULL, compares all versions. |
project |
Project name |
A data frame comparing the specified versions
ol_init("ex_compare_versions", root = tempfile()) ol_save("m", list(a = 1)) ol_save("m", list(a = 2)) ol_compare_versions("m")ol_init("ex_compare_versions", root = tempfile()) ol_save("m", list(a = 1)) ol_save("m", list(a = 2)) ol_compare_versions("m")
Creates a virtual table (view) based on a SQL query. Views are useful for creating reusable queries, especially for comparing multiple versions of data. Views do not store data but execute their query each time they are referenced.
ol_create_view( name, sql, project = getOption("ol.project"), replace = TRUE, depends_on = NULL )ol_create_view( name, sql, project = getOption("ol.project"), replace = TRUE, depends_on = NULL )
name |
Name for the view to create |
sql |
SQL query defining the view (must be a SELECT statement) |
project |
Project name (default: current project from options) |
replace |
Whether to replace the view if it already exists (default: TRUE) |
depends_on |
Optional character vector of table/object names that this view depends on |
Invisible qualified view name
if (FALSE) { ol_init("myproject") ol_write("genes", data.frame(gene_id = 1:100, expr = rnorm(100))) ol_create_view("high_expr", "SELECT * FROM genes WHERE expr > 0") ol_write("genes_v2", data.frame(gene_id = 1:100, expr = rnorm(100))) ol_create_view("gene_comparison", "SELECT g1.gene_id, g1.expr as expr_v1, g2.expr as expr_v2, (g2.expr - g1.expr) as change FROM genes g1 JOIN genes_v2 g2 ON g1.gene_id = g2.gene_id", depends_on = c("genes", "genes_v2") ) ol_read("gene_comparison") }if (FALSE) { ol_init("myproject") ol_write("genes", data.frame(gene_id = 1:100, expr = rnorm(100))) ol_create_view("high_expr", "SELECT * FROM genes WHERE expr > 0") ol_write("genes_v2", data.frame(gene_id = 1:100, expr = rnorm(100))) ol_create_view("gene_comparison", "SELECT g1.gene_id, g1.expr as expr_v1, g2.expr as expr_v2, (g2.expr - g1.expr) as change FROM genes g1 JOIN genes_v2 g2 ON g1.gene_id = g2.gene_id", depends_on = c("genes", "genes_v2") ) ol_read("gene_comparison") }
Add a cumulative sum column using window functions.
ol_cumulative_sum( table, column, partition_by = NULL, order_by, as_column = NULL, project = getOption("ol.project"), collect = TRUE )ol_cumulative_sum( table, column, partition_by = NULL, order_by, as_column = NULL, project = getOption("ol.project"), collect = TRUE )
table |
Character string, name of the table |
column |
Character string, column name to calculate cumulative sum on |
partition_by |
Character vector of columns to partition by (default: NULL) |
order_by |
Character string, column to order by (required) |
as_column |
Character, name of the output column (default: paste0(column, "_cumsum")) |
project |
Project name (default: current project) |
collect |
Logical; if TRUE returns data.frame, if FALSE returns lazy dplyr table |
Original table with added cumulative sum column
if (FALSE) { ol_cumulative_sum("counts", "value", order_by = "time") ol_cumulative_sum("counts", "value", partition_by = "sample", order_by = "gene_id" ) }if (FALSE) { ol_cumulative_sum("counts", "value", order_by = "time") ol_cumulative_sum("counts", "value", partition_by = "sample", order_by = "gene_id" ) }
Restores wrapped I/O functions in '.GlobalEnv' and optionally records tracked reads/writes to Lake before stopping observation mode.
ol_disable_transparent_tracking(commit = TRUE)ol_disable_transparent_tracking(commit = TRUE)
commit |
If TRUE, write tracked lineage and optional observation object to Lake |
A 'lake_observation' object (invisible) with tracked reads/writes/lineage
if (FALSE) { ol_enable_transparent_tracking(project = "rna_project", auto_disable = FALSE) # ... run normal analysis code ... ol_disable_transparent_tracking(commit = TRUE) }if (FALSE) { ol_enable_transparent_tracking(project = "rna_project", auto_disable = FALSE) # ... run normal analysis code ... ol_disable_transparent_tracking(commit = TRUE) }
Drop (delete) a table from the project
ol_drop(name, project = getOption("ol.project"))ol_drop(name, project = getOption("ol.project"))
name |
Name of the table to drop |
project |
Project name |
Invisible TRUE on success
ol_init("ex_ol_drop", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_drop("t")ol_init("ex_ol_drop", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_drop("t")
Drop (delete) an object from the project
ol_drop_object(name, project = getOption("ol.project"))ol_drop_object(name, project = getOption("ol.project"))
name |
Name of the object to drop |
project |
Project name |
Invisible TRUE on success
ol_init("ex_ol_drop_object", root = tempfile()) ol_save("m", list(a = 1)) ol_drop_object("m")ol_init("ex_ol_drop_object", root = tempfile()) ol_save("m", list(a = 1)) ol_drop_object("m")
Drops a view from the project. Also removes any dependency records associated with the view.
ol_drop_view(name, project = getOption("ol.project"))ol_drop_view(name, project = getOption("ol.project"))
name |
Name of the view to drop |
project |
Project name (default: current project from options) |
Invisible TRUE if successful
if (FALSE) { ol_init("myproject") ol_create_view("my_view", "SELECT * FROM genes WHERE expr > 0") ol_drop_view("my_view") }if (FALSE) { ol_init("myproject") ol_create_view("my_view", "SELECT * FROM genes WHERE expr > 0") ol_drop_view("my_view") }
Applies an opinionated, audit-first option preset for agent-mediated analysis: reproducibility metadata capture ON, clean-git requirement ON, and snapshot validation ON.
ol_enable_strict_repro_mode( path = getwd(), prompt_id = NULL, run_id = NULL, agent_name = NULL, include = c("git", "renv", "session", "system"), snapshot_validate_mode = c("error", "warn", "off"), max_tables = 200L )ol_enable_strict_repro_mode( path = getwd(), prompt_id = NULL, run_id = NULL, agent_name = NULL, include = c("git", "renv", "session", "system"), snapshot_validate_mode = c("error", "warn", "off"), max_tables = 200L )
path |
Base path used for Git/renv detection (usually repository root) |
prompt_id |
Optional prompt/work-item identifier |
run_id |
Optional run/session identifier |
agent_name |
Optional software-agent name |
include |
Metadata components to capture |
snapshot_validate_mode |
Snapshot validation behavior: "error", "warn", or "off" |
max_tables |
Maximum tables stored in snapshot validation details |
Named list of previous option values (invisible)
# Minimal runnable example for BiocCheck x <- 1 x if (FALSE) { ol_enable_strict_repro_mode( path = getwd(), prompt_id = "prompt-2026-02-21-001" ) }# Minimal runnable example for BiocCheck x <- 1 x if (FALSE) { ol_enable_strict_repro_mode( path = getwd(), prompt_id = "prompt-2026-02-21-001" ) }
Installs temporary wrappers for common unqualified I/O functions in '.GlobalEnv', so existing analysis code can run unchanged while reads/writes are tracked and recorded to Lake.
ol_enable_transparent_tracking( project = NULL, prefix = "file:", snapshot = NULL, track_functions = NULL, store_observation = TRUE, observation_name = NULL, observation_depends_on = c("writes", "reads", "both", "none"), auto_disable = TRUE, ... )ol_enable_transparent_tracking( project = NULL, prefix = "file:", snapshot = NULL, track_functions = NULL, store_observation = TRUE, observation_name = NULL, observation_depends_on = c("writes", "reads", "both", "none"), auto_disable = TRUE, ... )
project |
Optional project name. If set, calls 'use_lake(project, ...)'. |
prefix |
Prefix for file-based node names in the lake |
snapshot |
Optional snapshot label created when tracking is disabled with commit |
track_functions |
Character vector forwarded to tracking wrappers |
store_observation |
If TRUE, store observed reads/writes/lineage as an object |
observation_name |
Optional target name when 'store_observation = TRUE' |
observation_depends_on |
Dependencies used for observation record: '"writes"', '"reads"', '"both"', or '"none"' |
auto_disable |
If TRUE, installs a '.Last()' hook to auto-commit on session end |
... |
Additional arguments passed to 'use_lake()' when 'project' is provided |
Invisible Lake object
use_lake("ex_transparent", root = tempfile()) ol_enable_transparent_tracking() ol_disable_transparent_tracking(commit = FALSE)use_lake("ex_transparent", root = tempfile()) ol_enable_transparent_tracking() ol_disable_transparent_tracking(commit = FALSE)
Export a table or object to a Parquet file
ol_export_parquet( name, path, ref = "@latest", project = getOption("ol.project"), compression = c("snappy", "zstd", "lz4", "brotli", "uncompressed"), compression_level = NULL, row_group_size = 1e+05, overwrite = FALSE )ol_export_parquet( name, path, ref = "@latest", project = getOption("ol.project"), compression = c("snappy", "zstd", "lz4", "brotli", "uncompressed"), compression_level = NULL, row_group_size = 1e+05, overwrite = FALSE )
name |
Name of the table or object to export |
path |
Output file path for the Parquet file |
ref |
Version reference (default: "@latest") |
project |
Project name |
compression |
Compression algorithm: "snappy" (default), "zstd", "lz4", "brotli", or "uncompressed" |
compression_level |
Compression level (codec-specific, NULL for default) |
row_group_size |
Number of rows per row group (default: 100000) |
overwrite |
Whether to overwrite existing file (default: FALSE) |
Invisible normalized output path
ol_init("ex_export_parquet", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_export_parquet("t", file.path(tempdir(), "t.parquet"), overwrite = TRUE)ol_init("ex_export_parquet", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_export_parquet("t", file.path(tempdir(), "t.parquet"), overwrite = TRUE)
fread-like reader for Parquet tables
ol_fread( name, ref = "@latest", select = NULL, drop = NULL, nrows = Inf, filter = NULL, project = getOption("ol.project"), as_tibble = FALSE )ol_fread( name, ref = "@latest", select = NULL, drop = NULL, nrows = Inf, filter = NULL, project = getOption("ol.project"), as_tibble = FALSE )
name |
Table name |
ref |
Reference string |
select |
Optional character vector of columns to keep |
drop |
Optional character vector of columns to drop |
nrows |
Maximum rows to return |
filter |
Optional filter expression (string parsed by rlang) |
project |
Project name |
as_tibble |
If TRUE, return tibble when available |
Data frame or tibble
ol_init("ex_ol_fread", root = tempfile()) ol_write("t", data.frame(x = 1:3, y = 4:6)) ol_fread("t", select = "x")ol_init("ex_ol_fread", root = tempfile()) ol_write("t", data.frame(x = 1:3, y = 4:6)) ol_fread("t", select = "x")
Get dependencies for a table or object
ol_get_dependencies( name, direction = c("upstream", "downstream", "both"), project = getOption("ol.project") )ol_get_dependencies( name, direction = c("upstream", "downstream", "both"), project = getOption("ol.project") )
name |
Name of the table or object |
direction |
Direction to query: "upstream" (parents), "downstream" (children), or "both" |
project |
Project name |
Data frame with dependency info including version references (parent_ref, parent_version_id)
ol_init("ex_ol_get_dependencies", root = tempfile()) ol_write("raw", data.frame(x = 1:3)) ol_write("filtered", data.frame(x = 1:2), depends_on = "raw") ol_get_dependencies("filtered")ol_init("ex_ol_get_dependencies", root = tempfile()) ol_write("raw", data.frame(x = 1:3)) ol_write("filtered", data.frame(x = 1:2), depends_on = "raw") ol_get_dependencies("filtered")
Import a Parquet file into the project
ol_import_parquet( path, name, project = getOption("ol.project"), mode = c("create", "overwrite", "append"), depends_on = NULL, hive_partitioning = NULL, union_by_name = FALSE )ol_import_parquet( path, name, project = getOption("ol.project"), mode = c("create", "overwrite", "append"), depends_on = NULL, hive_partitioning = NULL, union_by_name = FALSE )
path |
Input file path(s) for Parquet file(s). Can be a single file, list of files, or glob pattern. |
name |
Destination table name in the project |
project |
Project name |
mode |
Import mode: "create", "overwrite", or "append" |
depends_on |
Optional character vector of table/object names that this import depends on |
hive_partitioning |
Whether to interpret path as Hive partitioned (NULL for auto-detect, TRUE/FALSE to force) |
union_by_name |
Whether to unify columns by name rather than position when reading multiple files |
Invisible TRUE on success
ol_init("ex_import_parquet", root = tempfile()) ol_write("t", data.frame(x = 1:3)) p <- file.path(tempdir(), "t.parquet") ol_export_parquet("t", p, overwrite = TRUE) ol_import_parquet(p, "t_imported")ol_init("ex_import_parquet", root = tempfile()) ol_write("t", data.frame(x = 1:3)) p <- file.path(tempdir(), "t.parquet") ol_export_parquet("t", p, overwrite = TRUE) ol_import_parquet(p, "t_imported")
Initialize an OmicsLake project
ol_init(project, root = NULL, ...)ol_init(project, root = NULL, ...)
project |
Project name |
root |
Optional storage root directory. Defaults to the OmicsLake root. |
... |
Additional arguments passed to the backend initializer |
Invisible normalized project root path
ol_init("ex_ol_init", root = tempfile())ol_init("ex_ol_init", root = tempfile())
Label current state with a human-friendly alias
ol_label( label, state_id = NULL, project = getOption("ol.project"), .in_transaction = FALSE )ol_label( label, state_id = NULL, project = getOption("ol.project"), .in_transaction = FALSE )
label |
Label name to assign to the current state |
state_id |
Optional state identifier; defaults to the current state |
project |
Project name |
.in_transaction |
Internal parameter - if TRUE, skip transaction in child calls (caller handles it) |
Invisible label name
ol_init("ex_ol_label", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_label("v1")ol_init("ex_ol_label", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_label("v1")
List all project-level labels
ol_list_labels(project = getOption("ol.project"))ol_list_labels(project = getOption("ol.project"))
project |
Project name |
Data frame of project labels
ol_init("ex_ol_list_labels", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_list_labels()ol_init("ex_ol_list_labels", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_list_labels()
Returns a data frame with all saved versions of an object, including timestamps, tags, size, and dependencies for each version.
ol_list_object_versions(name, project = getOption("ol.project"))ol_list_object_versions(name, project = getOption("ol.project"))
name |
Name of the object to list versions for |
project |
Project name |
A data frame with columns: version_ts, tags, size_bytes, dependencies
ol_init("ex_list_object_versions", root = tempfile()) ol_save("m", list(a = 1)) ol_list_object_versions("m")ol_init("ex_list_object_versions", root = tempfile()) ol_save("m", list(a = 1)) ol_list_object_versions("m")
List all saved objects in the project
ol_list_objects(project = getOption("ol.project"))ol_list_objects(project = getOption("ol.project"))
project |
Project name |
Data frame of object names
ol_init("ex_ol_list_objects", root = tempfile()) ol_save("m", list(a = 1)) ol_list_objects()ol_init("ex_ol_list_objects", root = tempfile()) ol_save("m", list(a = 1)) ol_list_objects()
List all tables in the project
ol_list_tables(project = getOption("ol.project"))ol_list_tables(project = getOption("ol.project"))
project |
Project name |
Data frame of table names
ol_init("ex_ol_list_tables", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_list_tables()ol_init("ex_ol_list_tables", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_list_tables()
List all tags for a table or all project labels
ol_list_tags(name = NULL, project = getOption("ol.project"))ol_list_tags(name = NULL, project = getOption("ol.project"))
name |
Optional table name to list tags for. If NULL, lists all tags. |
project |
Project name |
Data frame of tags
ol_init("ex_ol_list_tags", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_list_tags()ol_init("ex_ol_list_tags", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_list_tags()
Returns a data frame with information about all views in the project, including their SQL definitions and dependencies.
ol_list_views(project = getOption("ol.project"))ol_list_views(project = getOption("ol.project"))
project |
Project name (default: current project from options) |
A data frame with columns: view_name, definition, dependencies
ol_init("ex_list_views", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_create_view("v", "SELECT * FROM t") ol_list_views()ol_init("ex_list_views", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_create_view("v", "SELECT * FROM t") ol_list_views()
ol_read()
Alias of ol_read()
ol_load(name, ref = "@latest", project = getOption("ol.project"))ol_load(name, ref = "@latest", project = getOption("ol.project"))
name |
Table or object name |
ref |
Reference string (e.g. "@latest", "@tag(v1)") |
project |
Project name |
Data frame, lazy table, or stored object
ol_init("ex_ol_load", root = tempfile()) ol_save("model", list(a = 1)) ol_load("model")ol_init("ex_ol_load", root = tempfile()) ol_save("model", list(a = 1)) ol_load("model")
Return version log for a table
ol_log(name = NULL, project = getOption("ol.project"))ol_log(name = NULL, project = getOption("ol.project"))
name |
Optional table name. If NULL, returns commit log. |
project |
Project name |
Data frame of version history
ol_init("ex_ol_log", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_log()ol_init("ex_ol_log", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_log()
View commit history
ol_log_commits(project = getOption("ol.project"), n = 20)ol_log_commits(project = getOption("ol.project"), n = 20)
project |
Project name |
n |
Maximum number of commits to return |
Data frame of commits with reproducibility and agent metadata columns
ol_init("ex_ol_log_commits", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_commit("note") ol_log_commits()ol_init("ex_ol_log_commits", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_commit("note") ol_log_commits()
Add a moving average column using window functions.
ol_moving_avg( table, column, window_size = 3, partition_by = NULL, order_by, as_column = NULL, project = getOption("ol.project"), collect = TRUE )ol_moving_avg( table, column, window_size = 3, partition_by = NULL, order_by, as_column = NULL, project = getOption("ol.project"), collect = TRUE )
table |
Character string, name of the table |
column |
Character string, column name to calculate moving average on |
window_size |
Integer, size of the moving window (default: 3) |
partition_by |
Character vector of columns to partition by (default: NULL) |
order_by |
Character string, column to order by (required) |
as_column |
Character, name of the output column (default: paste0(column, "_ma", window_size)) |
project |
Project name (default: current project) |
collect |
Logical; if TRUE returns data.frame, if FALSE returns lazy dplyr table |
Original table with added moving average column
ol_init("ex_moving_avg", root = tempfile()) ol_write("t", data.frame(x = 1:5)) ol_moving_avg("t", "x", window_size = 2, order_by = "x")ol_init("ex_moving_avg", root = tempfile()) ol_write("t", data.frame(x = 1:5)) ol_moving_avg("t", "x", window_size = 2, order_by = "x")
Creates a visualization of the dependency relationships between tables and objects in the OmicsLake project. Requires the igraph package to be installed.
ol_plot_lineage( name, direction = c("upstream", "downstream", "both"), layout = c("tree", "sugiyama", "circle", "auto"), max_depth = 10, project = getOption("ol.project"), vertex.size = 20, vertex.label.cex = 0.8, edge.arrow.size = 0.5, main = NULL, ... )ol_plot_lineage( name, direction = c("upstream", "downstream", "both"), layout = c("tree", "sugiyama", "circle", "auto"), max_depth = 10, project = getOption("ol.project"), vertex.size = 20, vertex.label.cex = 0.8, edge.arrow.size = 0.5, main = NULL, ... )
name |
Name of the table or object to visualize |
direction |
Direction to traverse: "upstream" (dependencies), "downstream" (dependents), or "both" |
layout |
Graph layout algorithm: "tree", "sugiyama" (hierarchical), "circle", or "auto" |
max_depth |
Maximum depth to traverse (default: 10) |
project |
Project name |
vertex.size |
Size of graph nodes (default: 20) |
vertex.label.cex |
Size of node labels (default: 0.8) |
edge.arrow.size |
Size of edge arrows (default: 0.5) |
main |
Plot title (auto-generated if NULL) |
... |
Additional arguments passed to plot.igraph() |
An igraph object (invisibly)
if (requireNamespace("igraph", quietly = TRUE)) { ol_init("ex_plot_lineage", root = tempfile()) ol_write("raw", data.frame(x = 1:3)) ol_write("f", data.frame(x = 1:2), depends_on = "raw") ol_plot_lineage("f") }if (requireNamespace("igraph", quietly = TRUE)) { ol_init("ex_plot_lineage", root = tempfile()) ol_write("raw", data.frame(x = 1:3)) ol_write("f", data.frame(x = 1:2), depends_on = "raw") ol_plot_lineage("f") }
This function allows you to run arbitrary SQL queries against the tables in your OmicsLake project. It provides full access to DuckDB's SQL capabilities including JOINs, aggregations, window functions, and more. Table names can be referenced without the schema prefix (e.g., 'genes' instead of 'ol.genes').
ol_query(sql, project = getOption("ol.project"), collect = TRUE, params = NULL)ol_query(sql, project = getOption("ol.project"), collect = TRUE, params = NULL)
sql |
Character string containing the SQL query to execute |
project |
Project name (default: current project from options) |
collect |
Logical; if TRUE (default), returns a data.frame. If FALSE, returns a lazy dplyr table for further manipulation |
params |
Optional named list of parameters for parameterized queries |
If collect=TRUE, returns a data.frame with query results. If collect=FALSE, returns a lazy dplyr tbl for further manipulation.
ol_init("ex_query", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_query("SELECT COUNT(*) AS n FROM t")ol_init("ex_query", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_query("SELECT COUNT(*) AS n FROM t")
Read a table by name and reference
ol_read( name, ref = "@latest", project = getOption("ol.project"), collect = TRUE )ol_read( name, ref = "@latest", project = getOption("ol.project"), collect = TRUE )
name |
Table or object name |
ref |
Reference string (e.g. "@latest", "@tag(v1)") |
project |
Project name |
collect |
If TRUE, return data.frame; if FALSE, return lazy table |
Data frame, lazy table, or stored object
ol_init("ex_ol_read", root = tempfile()) ol_write("counts", data.frame(x = 1:3)) ol_read("counts")ol_init("ex_ol_read", root = tempfile()) ol_write("counts", data.frame(x = 1:3)) ol_read("counts")
Compose a MultiAssayExperiment
ol_read_mae( assays, ref = "@latest", project = getOption("ol.project"), backing = c("hdf5", "memory") )ol_read_mae( assays, ref = "@latest", project = getOption("ol.project"), backing = c("hdf5", "memory") )
assays |
Named list of assay specifications |
ref |
Reference string |
project |
Project name |
backing |
Backing mode: "hdf5" or "memory" |
MultiAssayExperiment object
if (requireNamespace("MultiAssayExperiment", quietly = TRUE)) { ol_init("ex_ol_read_mae", root = tempfile()) long <- data.frame( feature = rep(c("g1", "g2"), 2), sample = rep(c("s1", "s2"), each = 2), value = c(5, 8, 1, 3) ) ol_write("rna_long", long) ol_read_mae(list(rna = list(name = "rna_long")), backing = "memory") }if (requireNamespace("MultiAssayExperiment", quietly = TRUE)) { ol_init("ex_ol_read_mae", root = tempfile()) long <- data.frame( feature = rep(c("g1", "g2"), 2), sample = rep(c("s1", "s2"), each = 2), value = c(5, 8, 1, 3) ) ol_write("rna_long", long) ol_read_mae(list(rna = list(name = "rna_long")), backing = "memory") }
Read a stored object
ol_read_object( name, ref = "@latest", when = NULL, project = getOption("ol.project") )ol_read_object( name, ref = "@latest", when = NULL, project = getOption("ol.project") )
name |
Name of the object to read |
ref |
Reference to read from (e.g., "@latest", "@tag", "v1.0"). Defaults to "@latest" |
when |
Deprecated. Use ref parameter instead. If provided, "latest" or "first" |
project |
Project name |
The stored R object
ol_init("ex_ol_read_object", root = tempfile()) ol_save("model", list(a = 1)) ol_read_object("model")ol_init("ex_ol_read_object", root = tempfile()) ol_save("model", list(a = 1)) ol_read_object("model")
Build a SummarizedExperiment from long table
ol_read_se( name, ref = "@latest", feature_col = "feature", sample_col = "sample", value_col = "value", project = getOption("ol.project"), backing = c("hdf5", "memory") )ol_read_se( name, ref = "@latest", feature_col = "feature", sample_col = "sample", value_col = "value", project = getOption("ol.project"), backing = c("hdf5", "memory") )
name |
Table name |
ref |
Reference string |
feature_col |
Column name containing feature ids |
sample_col |
Column name containing sample ids |
value_col |
Column name containing measurement values |
project |
Project name |
backing |
Backing mode: "hdf5" or "memory" |
SummarizedExperiment object
ol_init("ex_ol_read_se", root = tempfile()) long <- data.frame( feature = rep(c("g1", "g2"), each = 2), sample = rep(c("s1", "s2"), 2), value = c(5, 8, 1, 3) ) ol_write("expr_long", long) ol_read_se("expr_long", backing = "memory")ol_init("ex_ol_read_se", root = tempfile()) long <- data.frame( feature = rep(c("g1", "g2"), each = 2), sample = rep(c("s1", "s2"), 2), value = c(5, 8, 1, 3) ) ol_write("expr_long", long) ol_read_se("expr_long", backing = "memory")
Save an R object via the backend metadata table
ol_save( name, object, project = getOption("ol.project"), mime = NULL, depends_on = NULL )ol_save( name, object, project = getOption("ol.project"), mime = NULL, depends_on = NULL )
name |
Object name |
object |
R object to save |
project |
Project name |
mime |
MIME type for object payload |
depends_on |
Optional character vector of table/object names that this object depends on |
Invisible TRUE on success
ol_init("ex_ol_save", root = tempfile()) ol_save("model", list(coef = 1:3))ol_init("ex_ol_save", root = tempfile()) ol_save("model", list(coef = 1:3))
Show lineage (full dependency tree) for a table or object
ol_show_lineage( name, direction = c("upstream", "downstream"), max_depth = 10, project = getOption("ol.project") )ol_show_lineage( name, direction = c("upstream", "downstream"), max_depth = 10, project = getOption("ol.project") )
name |
Name of the table or object |
direction |
Direction to traverse: "upstream" (all ancestors) or "downstream" (all descendants) |
max_depth |
Maximum depth to traverse (default: 10) |
project |
Project name |
Data frame describing the lineage tree
ol_init("ex_ol_show_lineage", root = tempfile()) ol_write("raw", data.frame(x = 1:3)) ol_write("filtered", data.frame(x = 1:2), depends_on = "raw") ol_show_lineage("filtered")ol_init("ex_ol_show_lineage", root = tempfile()) ol_write("raw", data.frame(x = 1:3)) ol_write("filtered", data.frame(x = 1:2), depends_on = "raw") ol_show_lineage("filtered")
Tag a table by creating a backup
ol_tag( name, tag, ref = "@latest", project = getOption("ol.project"), .in_transaction = FALSE )ol_tag( name, tag, ref = "@latest", project = getOption("ol.project"), .in_transaction = FALSE )
name |
Table name to tag |
tag |
Tag name to assign |
ref |
Reference to tag (e.g. "@latest") |
project |
Project name |
.in_transaction |
Internal parameter - if TRUE, skip transaction management (caller handles it) |
Invisible backup table name
ol_init("ex_ol_tag", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_tag("t", "raw")ol_init("ex_ol_tag", root = tempfile()) ol_write("t", data.frame(x = 1:3)) ol_tag("t", "raw")
Tag a stored object version
ol_tag_object( name, tag, when = "latest", project = getOption("ol.project"), .in_transaction = FALSE )ol_tag_object( name, tag, when = "latest", project = getOption("ol.project"), .in_transaction = FALSE )
name |
Name of the object to tag |
tag |
Tag name to assign |
when |
Which version to tag: "latest" (default) or "first", or a specific version_ts timestamp |
project |
Project name |
.in_transaction |
Internal parameter - if TRUE, skip transaction management (caller handles it) |
Invisible TRUE on success
ol_init("ex_ol_tag_object", root = tempfile()) ol_save("m", list(a = 1)) ol_tag_object("m", "v1")ol_init("ex_ol_tag_object", root = tempfile()) ol_save("m", list(a = 1)) ol_tag_object("m", "v1")
Get top N rows from a table, optionally partitioned.
ol_top_n( table, n = 10, order_by, partition_by = NULL, descending = TRUE, project = getOption("ol.project"), collect = TRUE )ol_top_n( table, n = 10, order_by, partition_by = NULL, descending = TRUE, project = getOption("ol.project"), collect = TRUE )
table |
Character string, name of the table |
n |
Integer, number of top rows to return per partition (default: 10) |
order_by |
Character string, column to order by (required) |
partition_by |
Character vector of columns to partition by (default: NULL for overall top N) |
descending |
Logical; if TRUE, order in descending order (default: TRUE) |
project |
Project name (default: current project) |
collect |
Logical; if TRUE returns data.frame, if FALSE returns lazy dplyr table |
Top N rows
if (FALSE) { ol_top_n("genes", n = 10, order_by = "expression") ol_top_n("genes", n = 5, order_by = "expression", partition_by = "sample" ) }if (FALSE) { ol_top_n("genes", n = 10, order_by = "expression") ol_top_n("genes", n = 5, order_by = "expression", partition_by = "sample" ) }
Write a table using the DuckDB backend
ol_write( name, data, project = getOption("ol.project"), mode = c("create", "overwrite", "append"), depends_on = NULL )ol_write( name, data, project = getOption("ol.project"), mode = c("create", "overwrite", "append"), depends_on = NULL )
name |
Table name |
data |
Data frame to store |
project |
Project name |
mode |
Write mode: "create", "overwrite", or "append" |
depends_on |
Optional character vector of table/object names that this table depends on |
Invisible qualified table name
ol_init("ex_ol_write", root = tempfile()) ol_write("counts", data.frame(gene = c("A", "B"), value = c(1, 2)))ol_init("ex_ol_write", root = tempfile()) ol_write("counts", data.frame(gene = c("A", "B"), value = c(1, 2)))
SQL-like operators for use in Lake queries. These operators provide familiar SQL semantics for filtering data.
See the individual operator help pages; each returns a logical vector.
df <- data.frame( gene = c("MT-CO1", "MT-CO2", "ACTB"), value = c(50, 80, 5) ) # Pattern matching df[df$gene %like% "MT-%", ] # Range filtering df[df$value %between% c(10, 100), ] # Case-insensitive matching df[df$gene %ilike% "mt-%", ]df <- data.frame( gene = c("MT-CO1", "MT-CO2", "ACTB"), value = c(50, 80, 5) ) # Pattern matching df[df$gene %like% "MT-%", ] # Range filtering df[df$value %between% c(10, 100), ] # Case-insensitive matching df[df$gene %ilike% "mt-%", ]
Adapter for storing and retrieving phosphoproteomics-layer objects.
Supports explicit phosphoproteomics marker classes/metadata.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> PhosphoproteomicsAdapter
name()
PhosphoproteomicsAdapter$name()
priority()
PhosphoproteomicsAdapter$priority()
put()
PhosphoproteomicsAdapter$put(lake, name, data)
get()
PhosphoproteomicsAdapter$get(lake, name, ref = "@latest")
components()
PhosphoproteomicsAdapter$components(lake, name)
exists()
PhosphoproteomicsAdapter$exists(lake, name)
list_names()
PhosphoproteomicsAdapter$list_names(lake)
can_handle()
PhosphoproteomicsAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
PhosphoproteomicsAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- PhosphoproteomicsAdapter$new() class(adapter)adapter <- PhosphoproteomicsAdapter$new() class(adapter)
Print method for lake_observation
## S3 method for class 'lake_observation' print(x, ...)## S3 method for class 'lake_observation' print(x, ...)
x |
A lake_observation object |
... |
Additional arguments (ignored) |
Invisibly returns x.
Print method for lake_repair_report
## S3 method for class 'lake_repair_report' print(x, ...)## S3 method for class 'lake_repair_report' print(x, ...)
x |
A lake_repair_report object |
... |
Additional arguments (ignored) |
The input object, invisibly
Adapter for storing and retrieving proteomics-layer objects.
This umbrella adapter is lower priority than specific adapters (e.g. QFeatures / MsExperiment / Spectra) and captures proteomics-marked objects.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> ProteomicsAdapter
name()
ProteomicsAdapter$name()
priority()
ProteomicsAdapter$priority()
put()
ProteomicsAdapter$put(lake, name, data)
get()
ProteomicsAdapter$get(lake, name, ref = "@latest")
components()
ProteomicsAdapter$components(lake, name)
exists()
ProteomicsAdapter$exists(lake, name)
list_names()
ProteomicsAdapter$list_names(lake)
can_handle()
ProteomicsAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
ProteomicsAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- ProteomicsAdapter$new() class(adapter)adapter <- ProteomicsAdapter$new() class(adapter)
Write data to the default lake
put(name, data, ...)put(name, data, ...)
name |
Name for the data |
data |
Data to store |
... |
Additional arguments passed to Lake$put() |
Invisible Lake object
use_lake("ex_put", root = tempfile()) put("counts", data.frame(gene = c("A", "B"), value = c(1, 2)))use_lake("ex_put", root = tempfile()) put("counts", data.frame(gene = c("A", "B"), value = c(1, 2)))
Adapter for storing and retrieving
QFeatures objects.
This adapter preserves QFeatures components:
underlying experiments/sample maps via MultiAssayExperiment adapter
assay links (assayLinks)
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> QFeaturesAdapter
name()
QFeaturesAdapter$name()
can_handle()
QFeaturesAdapter$can_handle(data)
priority()
QFeaturesAdapter$priority()
put()
QFeaturesAdapter$put(lake, name, data)
get()
QFeaturesAdapter$get(lake, name, ref = "@latest")
components()
QFeaturesAdapter$components(lake, name)
exists()
QFeaturesAdapter$exists(lake, name)
list_names()
QFeaturesAdapter$list_names(lake)
clone()
The objects of this class are cloneable with this method.
QFeaturesAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- QFeaturesAdapter$new() class(adapter)adapter <- QFeaturesAdapter$new() class(adapter)
Start a query builder on the default lake
query()query()
A QueryBuilder instance
use_lake("ex_query", root = tempfile()) put("t", data.frame(x = 1:3)) qb <- query()use_lake("ex_query", root = tempfile()) put("t", data.frame(x = 1:3)) qb <- query()
Build complex queries using a fluent, chainable API. Provides an intuitive way to construct queries without writing SQL.
A QueryBuilder R6 generator; call $new() to create one.
new()
Initialize a QueryBuilder
QueryBuilder$new(lake)
lakeLake instance to query from
from()
Specify the source table
QueryBuilder$from(table, alias = NULL)
tableTable name
aliasOptional alias for the table
Self for chaining
join()
Add a join clause
QueryBuilder$join(table, on = NULL, type = "left", alias = NULL)
tableTable to join
onJoin condition (character vector of column names, or named vector for different column names)
typeJoin type ("left", "inner", "right", "full")
aliasOptional alias for the joined table
Self for chaining
left_join()
Add a LEFT JOIN
QueryBuilder$left_join(table, on = NULL, alias = NULL)
tableTable to join
onJoin condition
aliasOptional alias
Self for chaining
inner_join()
Add an INNER JOIN
QueryBuilder$inner_join(table, on = NULL, alias = NULL)
tableTable to join
onJoin condition
aliasOptional alias
Self for chaining
right_join()
Add a RIGHT JOIN
QueryBuilder$right_join(table, on = NULL, alias = NULL)
tableTable to join
onJoin condition
aliasOptional alias
Self for chaining
full_join()
Add a FULL JOIN
QueryBuilder$full_join(table, on = NULL, alias = NULL)
tableTable to join
onJoin condition
aliasOptional alias
Self for chaining
where()
Add a filter condition (WHERE clause)
QueryBuilder$where(...)
...Filter expressions (combined with AND)
Self for chaining
filter()
Alias for where
QueryBuilder$filter(...)
...Filter expressions
Self for chaining
select()
Select columns
QueryBuilder$select(...)
...Column names or expressions
Self for chaining
pick()
Alias for select
QueryBuilder$pick(...)
...Column names or expressions
Self for chaining
mutate()
Add computed columns
QueryBuilder$mutate(...)
...Name-value pairs for new columns
Self for chaining
group_by()
Group by columns
QueryBuilder$group_by(...)
...Grouping columns
Self for chaining
summarize()
Summarize after grouping
QueryBuilder$summarize(...)
...Aggregation expressions
Self for chaining
summarise()
Alias for summarize
QueryBuilder$summarise(...)
...Aggregation expressions
Self for chaining
having()
Add HAVING clause (filter after grouping)
QueryBuilder$having(...)
...Filter conditions
Self for chaining
order_by()
Order results
QueryBuilder$order_by(...)
...Columns to order by (use desc() for descending)
Self for chaining
arrange()
Alias for order_by
QueryBuilder$arrange(...)
...Columns to order by
Self for chaining
limit()
Limit the number of results
QueryBuilder$limit(n)
nMaximum number of rows
Self for chaining
take()
Alias for limit
QueryBuilder$take(n)
nMaximum number of rows
Self for chaining
top()
Get top N rows by a column
QueryBuilder$top(n, by, desc = TRUE)
nNumber of rows
byColumn to order by
descUse descending order (default: TRUE)
Self for chaining
offset()
Skip rows
QueryBuilder$offset(n)
nNumber of rows to skip
Self for chaining
distinct()
Return distinct rows only
QueryBuilder$distinct(...)
...Optional columns to check for distinctness
Self for chaining
run()
Execute the query and return results
QueryBuilder$run()
Data frame of results
collect()
Alias for run
QueryBuilder$collect()
Data frame of results
as()
Execute and save to lake
QueryBuilder$as(name)
nameName to save as
Invisible Lake object
save_as()
Save alias for as
QueryBuilder$save_as(name)
nameName to save as
Invisible Lake object
show_sql()
Get the generated SQL (for debugging)
QueryBuilder$show_sql()
SQL string
explain()
Explain the query plan
QueryBuilder$explain()
Explanation data frame
print()
Print query builder state
QueryBuilder$print()
clone()
The objects of this class are cloneable with this method.
QueryBuilder$clone(deep = FALSE)
deepWhether to make a deep clone.
if (FALSE) { lake <- Lake$new("my_project") # Basic query lake$from("users")$ where(age > 30)$ select(name, age)$ run() # Join and aggregate lake$from("orders")$ join("customers", on = "customer_id")$ where(status == "completed")$ group_by(region)$ summarize(total = sum(amount))$ order_by(desc(total))$ run() # Save results to lake lake$from("data")$ filter(quality > 0.8)$ as("filtered_data") }if (FALSE) { lake <- Lake$new("my_project") # Basic query lake$from("users")$ where(age > 30)$ select(name, age)$ run() # Join and aggregate lake$from("orders")$ join("customers", on = "customer_id")$ where(status == "completed")$ group_by(region)$ summarize(total = sum(amount))$ order_by(desc(total))$ run() # Save results to lake lake$from("data")$ filter(quality > 0.8)$ as("filtered_data") }
Adapter for storing and retrieving RaggedExperiment objects.
This adapter stores a full-fidelity serialized RaggedExperiment object and manifest.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> RaggedExperimentAdapter
name()
RaggedExperimentAdapter$name()
priority()
RaggedExperimentAdapter$priority()
put()
RaggedExperimentAdapter$put(lake, name, data)
get()
RaggedExperimentAdapter$get(lake, name, ref = "@latest")
components()
RaggedExperimentAdapter$components(lake, name)
exists()
RaggedExperimentAdapter$exists(lake, name)
list_names()
RaggedExperimentAdapter$list_names(lake)
can_handle()
RaggedExperimentAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
RaggedExperimentAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- RaggedExperimentAdapter$new() class(adapter)adapter <- RaggedExperimentAdapter$new() class(adapter)
Use this to explicitly record file reads when automatic tracking is not available. Call this within an observe() block.
record_read(path)record_read(path)
path |
File path that was read |
Invisibly returns the path
if (FALSE) { observe({ record_read("input.csv") data <- read.csv("input.csv") record_write("output.csv") write.csv(data, "output.csv") }) }if (FALSE) { observe({ record_read("input.csv") data <- read.csv("input.csv") record_write("output.csv") write.csv(data, "output.csv") }) }
Use this to explicitly record file writes when automatic tracking is not available. Call this within an observe() block.
record_write(path)record_write(path)
path |
File path that was written |
Invisibly returns the path
use_lake("ex_record_write", root = tempfile()) f <- file.path(tempdir(), "result.csv") write.csv(data.frame(x = 1:3), f, row.names = FALSE) record_write(f)use_lake("ex_record_write", root = tempfile()) f <- file.path(tempdir(), "result.csv") write.csv(data.frame(x = 1:3), f, row.names = FALSE) record_write(f)
Get a lazy reference from the default lake
ref(name)ref(name)
name |
Table name |
A lazy table reference for use with dplyr
use_lake("ex_ref", root = tempfile()) put("t", data.frame(x = 1:5)) dplyr::collect(dplyr::filter(ref("t"), x > 2))use_lake("ex_ref", root = tempfile()) put("t", data.frame(x = 1:5)) dplyr::collect(dplyr::filter(ref("t"), x > 2))
Register a data adapter
register_adapter(adapter)register_adapter(adapter)
adapter |
An LakeAdapter instance |
Invisible TRUE on success
register_adapter(SEAdapter$new())register_adapter(SEAdapter$new())
Restore the default lake to a snapshot
restore(label)restore(label)
label |
Snapshot label |
Invisible Lake object
use_lake("ex_restore", root = tempfile()) put("t", data.frame(x = 1:3)) snap("v1") restore("v1")use_lake("ex_restore", root = tempfile()) put("t", data.frame(x = 1:3)) snap("v1") restore("v1")
This function is designed to be used at the end of a dplyr pipe to save results to a Lake with automatic dependency tracking.
save_as(.data, name, lake = NULL)save_as(.data, name, lake = NULL)
.data |
Data from pipe (data.frame or tbl_lazy) |
name |
Name to save as in the lake |
lake |
Lake instance. If NULL, uses the default lake from use_lake() |
Invisibly returns the data (for potential further piping)
if (FALSE) { lake$ref("raw_data") |> dplyr::filter(quality > 0.5) |> dplyr::mutate(normalized = value / mean(value)) |> save_as("processed_data", lake) }if (FALSE) { lake$ref("raw_data") |> dplyr::filter(quality > 0.5) |> dplyr::mutate(normalized = value / mean(value)) |> save_as("processed_data", lake) }
Adapter for storing and retrieving SingleCellExperiment objects.
This adapter extends SummarizedExperiment support by preserving SingleCellExperiment-specific components:
reduced dimensions (reducedDims)
alternative experiments (altExps)
row/column pairings (rowPairs, colPairs)
size factors (sizeFactors)
column labels (colLabels)
main experiment label (mainExpName)
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> SCEAdapter
name()
SCEAdapter$name()
can_handle()
SCEAdapter$can_handle(data)
priority()
SCEAdapter$priority()
put()
SCEAdapter$put(lake, name, data)
get()
SCEAdapter$get(lake, name, ref = "@latest")
components()
SCEAdapter$components(lake, name)
exists()
SCEAdapter$exists(lake, name)
list_names()
SCEAdapter$list_names(lake)
clone()
The objects of this class are cloneable with this method.
SCEAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- SCEAdapter$new() class(adapter)adapter <- SCEAdapter$new() class(adapter)
Adapter for storing and retrieving Bioconductor SummarizedExperiment objects. Stores all components (assays, colData, rowData, metadata) with full fidelity.
This adapter decomposes a SummarizedExperiment into its components:
Assays are stored as tables (sparse matrix -> long format)
colData is stored as a table
rowData is stored as a table
metadata is stored as an R object
An SEAdapter R6 generator for SummarizedExperiment objects.
OmicsLake::LakeAdapter -> SEAdapter
name()
SEAdapter$name()
can_handle()
SEAdapter$can_handle(data)
priority()
SEAdapter$priority()
put()
SEAdapter$put(lake, name, data)
get()
SEAdapter$get(lake, name, ref = "@latest")
components()
SEAdapter$components(lake, name)
exists()
SEAdapter$exists(lake, name)
list_names()
SEAdapter$list_names(lake)
clone()
The objects of this class are cloneable with this method.
SEAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
if (FALSE) { library(SummarizedExperiment) # Create a SE object se <- SummarizedExperiment( assays = list(counts = matrix(1:100, 10, 10)), colData = DataFrame(sample = paste0("S", 1:10)), rowData = DataFrame(gene = paste0("G", 1:10)) ) # Store in lake lake$put("my_se", se) # Retrieve se2 <- lake$get("my_se") }if (FALSE) { library(SummarizedExperiment) # Create a SE object se <- SummarizedExperiment( assays = list(counts = matrix(1:100, 10, 10)), colData = DataFrame(sample = paste0("S", 1:10)), rowData = DataFrame(gene = paste0("G", 1:10)) ) # Store in lake lake$put("my_se", se) # Retrieve se2 <- lake$get("my_se") }
Adapter for storing and retrieving Seurat objects.
This adapter stores a full-fidelity serialized Seurat object and manifest.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> SeuratAdapter
name()
SeuratAdapter$name()
priority()
SeuratAdapter$priority()
put()
SeuratAdapter$put(lake, name, data)
get()
SeuratAdapter$get(lake, name, ref = "@latest")
components()
SeuratAdapter$components(lake, name)
exists()
SeuratAdapter$exists(lake, name)
list_names()
SeuratAdapter$list_names(lake)
can_handle()
SeuratAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
SeuratAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- SeuratAdapter$new() class(adapter)adapter <- SeuratAdapter$new() class(adapter)
Convenience functions for working with a default lake. These functions provide a simpler API when working with a single project.
Each shortcut returns the value of the underlying Lake
method it wraps (see the individual help pages).
use_lake("ex_shortcuts", root = tempfile()) put("counts", data.frame(gene = c("A", "B"), value = c(1, 2))) fetch("counts") snap("v1.0") tree()use_lake("ex_shortcuts", root = tempfile()) put("counts", data.frame(gene = c("A", "B"), value = c(1, 2))) fetch("counts") snap("v1.0") tree()
Show migration guide for ol_* to Lake API
show_migration_guide()show_migration_guide()
Invisible NULL; prints the migration guide to the console.
show_migration_guide()show_migration_guide()
Create a snapshot of the default lake
snap(label, ...)snap(label, ...)
label |
Label for the snapshot |
... |
Additional arguments passed to Lake$snap() |
Invisible Lake object
use_lake("ex_snap", root = tempfile()) put("t", data.frame(x = 1:3)) snap("v1.0")use_lake("ex_snap", root = tempfile()) put("t", data.frame(x = 1:3)) snap("v1.0")
Adapter for storing and retrieving SpatialExperiment objects.
This adapter stores a full-fidelity serialized SpatialExperiment object and manifest.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> SpatialExperimentAdapter
name()
SpatialExperimentAdapter$name()
priority()
SpatialExperimentAdapter$priority()
put()
SpatialExperimentAdapter$put(lake, name, data)
get()
SpatialExperimentAdapter$get(lake, name, ref = "@latest")
components()
SpatialExperimentAdapter$components(lake, name)
exists()
SpatialExperimentAdapter$exists(lake, name)
list_names()
SpatialExperimentAdapter$list_names(lake)
can_handle()
SpatialExperimentAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
SpatialExperimentAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- SpatialExperimentAdapter$new() class(adapter)adapter <- SpatialExperimentAdapter$new() class(adapter)
Adapter for storing and retrieving
Spectra objects.
This adapter preserves Spectra components:
peak lists (peaksData)
per-spectrum metadata (spectraData)
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> SpectraAdapter
name()
SpectraAdapter$name()
can_handle()
SpectraAdapter$can_handle(data)
priority()
SpectraAdapter$priority()
put()
SpectraAdapter$put(lake, name, data)
get()
SpectraAdapter$get(lake, name, ref = "@latest")
components()
SpectraAdapter$components(lake, name)
exists()
SpectraAdapter$exists(lake, name)
list_names()
SpectraAdapter$list_names(lake)
clone()
The objects of this class are cloneable with this method.
SpectraAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- SpectraAdapter$new() class(adapter)adapter <- SpectraAdapter$new() class(adapter)
Execute SQL on the default lake
sql(query, ...)sql(query, ...)
query |
SQL query string |
... |
Additional arguments passed to Lake$sql() |
Query results
use_lake("ex_sql", root = tempfile()) put("t", data.frame(x = 1:3)) sql("SELECT COUNT(*) AS n FROM t")use_lake("ex_sql", root = tempfile()) put("t", data.frame(x = 1:3)) sql("SELECT COUNT(*) AS n FROM t")
Check if string starts with a prefix
starts_with_str(x, prefix)starts_with_str(x, prefix)
x |
Character vector |
prefix |
Prefix to check for |
Logical vector
genes <- c("MT-CO1", "MT-CO2", "ACTB") genes[starts_with_str(genes, "MT-")]genes <- c("MT-CO1", "MT-CO2", "ACTB") genes[starts_with_str(genes, "MT-")]
List tables in the default lake
tables()tables()
Data frame of table names
use_lake("ex_tables", root = tempfile()) put("t", data.frame(x = 1:3)) tables()use_lake("ex_tables", root = tempfile()) put("t", data.frame(x = 1:3)) tables()
Tag data in the default lake
tag(name, tag)tag(name, tag)
name |
Data name |
tag |
Tag to apply |
Invisible Lake object
use_lake("ex_tag", root = tempfile()) put("counts", data.frame(x = 1:3)) tag("counts", "raw")use_lake("ex_tag", root = tempfile()) put("counts", data.frame(x = 1:3)) tag("counts", "raw")
Temporarily hooks into specified functions to track their calls. More invasive than observe() but provides finer-grained control.
trace_calls(functions, expr, lake = NULL)trace_calls(functions, expr, lake = NULL)
functions |
Named list of functions to trace |
expr |
Expression to evaluate while tracing |
lake |
Optional lake to record to |
List with result and call trace
lake <- Lake$new("ex_trace_calls", root = tempfile()) trace_calls(character(0), { x <- 1 }, lake = lake)lake <- Lake$new("ex_trace_calls", root = tempfile()) trace_calls(character(0), { x <- 1 }, lake = lake)
Uses 'observe_to_lake()' under the hood and optionally creates a snapshot after successful execution.
track_pipeline( expr, project = NULL, prefix = "file:", snapshot = NULL, track_functions = NULL, save_result = FALSE, result_name = NULL, result_depends_on = c("writes", "reads", "both", "none"), store_observation = FALSE, observation_name = NULL, observation_depends_on = c("writes", "reads", "both", "none"), ... )track_pipeline( expr, project = NULL, prefix = "file:", snapshot = NULL, track_functions = NULL, save_result = FALSE, result_name = NULL, result_depends_on = c("writes", "reads", "both", "none"), store_observation = FALSE, observation_name = NULL, observation_depends_on = c("writes", "reads", "both", "none"), ... )
expr |
Expression to execute and track |
project |
Optional project name. If set, calls 'use_lake(project, ...)'. |
prefix |
Prefix for file-based node names in the lake |
snapshot |
Optional snapshot label created after successful execution |
track_functions |
Character vector forwarded to 'observe()' |
save_result |
If TRUE, store the expression result in the Lake |
result_name |
Optional target name when 'save_result = TRUE' |
result_depends_on |
Dependencies used for saved result: '"writes"', '"reads"', '"both"', or '"none"' |
store_observation |
If TRUE, store observed reads/writes/lineage as an object |
observation_name |
Optional target name when 'store_observation = TRUE' |
observation_depends_on |
Dependencies used for observation record: '"writes"', '"reads"', '"both"', or '"none"' |
... |
Additional arguments passed to 'use_lake()' when 'project' is provided |
The result of evaluating 'expr'
if (FALSE) { # Track an existing block with the current default lake use_lake("rna_seq_project") track_pipeline( { x <- read.csv("counts.csv") write.csv(x, "counts_copy.csv", row.names = FALSE) }, snapshot = "ingest_v1", save_result = TRUE, result_name = "counts_copy_summary", store_observation = TRUE, observation_name = "obs_ingest_v1" ) }if (FALSE) { # Track an existing block with the current default lake use_lake("rna_seq_project") track_pipeline( { x <- read.csv("counts.csv") write.csv(x, "counts_copy.csv", row.names = FALSE) }, snapshot = "ingest_v1", save_result = TRUE, result_name = "counts_copy_summary", store_observation = TRUE, observation_name = "obs_ingest_v1" ) }
Sources a script with 'local = TRUE' inside observation mode so common unqualified I/O calls in the script can be intercepted.
track_script( path, project = NULL, prefix = "file:", snapshot = NULL, track_functions = NULL, save_result = FALSE, result_name = NULL, result_depends_on = c("writes", "reads", "both", "none"), store_observation = FALSE, observation_name = NULL, observation_depends_on = c("writes", "reads", "both", "none"), chdir = FALSE, echo = FALSE, source_args = list(), ... )track_script( path, project = NULL, prefix = "file:", snapshot = NULL, track_functions = NULL, save_result = FALSE, result_name = NULL, result_depends_on = c("writes", "reads", "both", "none"), store_observation = FALSE, observation_name = NULL, observation_depends_on = c("writes", "reads", "both", "none"), chdir = FALSE, echo = FALSE, source_args = list(), ... )
path |
Script path passed to 'source()' |
project |
Optional project name. If set, calls 'use_lake(project, ...)'. |
prefix |
Prefix for file-based node names in the lake |
snapshot |
Optional snapshot label created after successful execution |
track_functions |
Character vector forwarded to 'observe()' |
save_result |
If TRUE, store the script return value in the Lake |
result_name |
Optional target name when 'save_result = TRUE' |
result_depends_on |
Dependencies used for saved result: '"writes"', '"reads"', '"both"', or '"none"' |
store_observation |
If TRUE, store observed reads/writes/lineage as an object |
observation_name |
Optional target name when 'store_observation = TRUE' |
observation_depends_on |
Dependencies used for observation record: '"writes"', '"reads"', '"both"', or '"none"' |
chdir |
Passed to 'source()' |
echo |
Passed to 'source()' |
source_args |
Named list of additional arguments passed to 'source()'. Reserved names ('file', 'local', 'chdir', 'echo') are not allowed. |
... |
Additional arguments passed to 'use_lake()' when 'project' is provided |
The return value of the sourced script ('source(...)$value')
if (FALSE) { track_script("analysis_pipeline.R", project = "rna_seq_project", snapshot = "run_2026_02_21") }if (FALSE) { track_script("analysis_pipeline.R", project = "rna_seq_project", snapshot = "run_2026_02_21") }
Adapter for storing and retrieving transcriptomics-layer objects.
This umbrella adapter is lower priority than specific adapters (e.g. SingleCellExperiment / SummarizedExperiment) and captures transcriptomics-marked objects.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> TranscriptomicsAdapter
name()
TranscriptomicsAdapter$name()
priority()
TranscriptomicsAdapter$priority()
put()
TranscriptomicsAdapter$put(lake, name, data)
get()
TranscriptomicsAdapter$get(lake, name, ref = "@latest")
components()
TranscriptomicsAdapter$components(lake, name)
exists()
TranscriptomicsAdapter$exists(lake, name)
list_names()
TranscriptomicsAdapter$list_names(lake)
can_handle()
TranscriptomicsAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
TranscriptomicsAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- TranscriptomicsAdapter$new() class(adapter)adapter <- TranscriptomicsAdapter$new() class(adapter)
Show lineage tree from the default lake
tree(name = NULL, ...)tree(name = NULL, ...)
name |
Starting node (optional) |
... |
Additional arguments passed to Lake$tree() |
Lineage data frame
use_lake("ex_tree", root = tempfile()) put("raw", data.frame(x = 1:3)) tree()use_lake("ex_tree", root = tempfile()) put("raw", data.frame(x = 1:3)) tree()
Removes a dependency relationship between two nodes.
unlink_dep(from, to, lake = NULL)unlink_dep(from, to, lake = NULL)
from |
Source node name |
to |
Target node name |
lake |
Lake instance (uses default if NULL) |
Invisible TRUE on success
use_lake("ex_unlink_dep", root = tempfile()) put("raw", data.frame(x = 1:3)) put("filtered", data.frame(x = 1:2), depends_on = "raw") unlink_dep("raw", "filtered")use_lake("ex_unlink_dep", root = tempfile()) put("raw", data.frame(x = 1:3)) put("filtered", data.frame(x = 1:2), depends_on = "raw") unlink_dep("raw", "filtered")
Set or get the default lake
use_lake(project = NULL, ...)use_lake(project = NULL, ...)
project |
Project name. If provided, creates/opens a lake and sets it as default. |
... |
Additional arguments passed to Lake$new() |
The default Lake object (invisibly when setting)
use_lake("ex_use_lake", root = tempfile()) current <- use_lake() # Get current lakeuse_lake("ex_use_lake", root = tempfile()) current <- use_lake() # Get current lake
Adapter for storing and retrieving VariantAnnotation VCF objects.
This adapter stores a full-fidelity serialized VCF object and manifest.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> VCFAdapter
name()
VCFAdapter$name()
priority()
VCFAdapter$priority()
put()
VCFAdapter$put(lake, name, data)
get()
VCFAdapter$get(lake, name, ref = "@latest")
components()
VCFAdapter$components(lake, name)
exists()
VCFAdapter$exists(lake, name)
list_names()
VCFAdapter$list_names(lake)
can_handle()
VCFAdapter$can_handle(data)
clone()
The objects of this class are cloneable with this method.
VCFAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- VCFAdapter$new() class(adapter)adapter <- VCFAdapter$new() class(adapter)
A simpler alternative to observe() that directly integrates with Lake. Wraps code execution and records any lake operations.
with_tracking(lake, name, expr)with_tracking(lake, name, expr)
lake |
Lake instance |
name |
Name for the output in the lineage |
expr |
Expression to track |
The result of the expression
if (FALSE) { lake <- Lake$new("project") result <- with_tracking(lake, "analysis_result", { data <- lake$get("raw_data") processed <- transform(data) processed }) # Result is automatically saved with tracked dependencies lake$tree("analysis_result") }if (FALSE) { lake <- Lake$new("project") result <- with_tracking(lake, "analysis_result", { data <- lake$get("raw_data") processed <- transform(data) processed }) # Result is automatically saved with tracked dependencies lake$tree("analysis_result") }
Wrap existing functions to automatically track data lineage. Enables non-invasive integration with existing analysis pipelines.
Function wrapping provides a way to add lineage tracking to existing code without modifying the original functions. Wrapped functions automatically record their inputs and outputs to the lineage graph.
See the individual function help pages for return values.
if (FALSE) { lake <- Lake$new("project") # Wrap a function tracked_normalize <- wrap_fn(normalize_data, lake, "normalized") # Use the wrapped function result <- tracked_normalize(raw_data) # Dependencies are automatically recorded # Or wrap and use inline result <- lake |> wrap_call(normalize_data, raw_data, output = "normalized") }if (FALSE) { lake <- Lake$new("project") # Wrap a function tracked_normalize <- wrap_fn(normalize_data, lake, "normalized") # Use the wrapped function result <- tracked_normalize(raw_data) # Dependencies are automatically recorded # Or wrap and use inline result <- lake |> wrap_call(normalize_data, raw_data, output = "normalized") }
Execute a function call with lineage tracking, without creating a persistent wrapper.
wrap_call(lake, fn, ..., output = NULL, save = TRUE)wrap_call(lake, fn, ..., output = NULL, save = TRUE)
lake |
Lake instance |
fn |
Function to call |
... |
Arguments to pass to fn |
output |
Name for the output in the lineage |
save |
If TRUE, save the result to the lake |
The result of calling fn
if (FALSE) { lake <- Lake$new("project") result <- wrap_call(lake, mean, c(1, 2, 3, NA), na.rm = TRUE, output = "mean_result", save = FALSE ) }if (FALSE) { lake <- Lake$new("project") result <- wrap_call(lake, mean, c(1, 2, 3, NA), na.rm = TRUE, output = "mean_result", save = FALSE ) }
Creates a wrapped version of a function that automatically records its execution in the lake's lineage graph.
wrap_fn(fn, lake, output_name, input_names = NULL, save_output = TRUE)wrap_fn(fn, lake, output_name, input_names = NULL, save_output = TRUE)
fn |
Function to wrap |
lake |
Lake instance for lineage recording |
output_name |
Name for the output in the lineage graph |
input_names |
Optional character vector specifying which arguments should be recorded as dependencies. If NULL, attempts to detect lake-sourced data automatically. |
save_output |
If TRUE, automatically saves the output to the lake |
A wrapped function with the same signature as fn
lake <- Lake$new("ex_wrap_fn", root = tempfile()) lake$put("raw", data.frame(x = 1:3)) tracked <- wrap_fn(function(d) d, lake, "out") invisible(tracked(lake$get("raw")))lake <- Lake$new("ex_wrap_fn", root = tempfile()) lake$put("raw", data.frame(x = 1:3)) tracked <- wrap_fn(function(d) d, lake, "out") invisible(tracked(lake$get("raw")))
Adapter for storing and retrieving xcms objects
(XCMSnExp and XcmsExperiment).
This adapter currently guarantees full-fidelity roundtrip by storing the complete object and manifest as internal components.
An R6 generator for a LakeAdapter subclass that
serializes and restores objects of this omics layer.
OmicsLake::LakeAdapter -> XCMSAdapter
name()
XCMSAdapter$name()
can_handle()
XCMSAdapter$can_handle(data)
priority()
XCMSAdapter$priority()
put()
XCMSAdapter$put(lake, name, data)
get()
XCMSAdapter$get(lake, name, ref = "@latest")
components()
XCMSAdapter$components(lake, name)
exists()
XCMSAdapter$exists(lake, name)
list_names()
XCMSAdapter$list_names(lake)
clone()
The objects of this class are cloneable with this method.
XCMSAdapter$clone(deep = FALSE)
deepWhether to make a deep clone.
adapter <- XCMSAdapter$new() class(adapter)adapter <- XCMSAdapter$new() class(adapter)