scFlex is an R package for converting single cell classes among Seurat, SingleCellExperiment, AnnData, and Loom.
The goal is not merely to produce a file with a new extension. scFlex checks cell/feature alignment, distinguishes raw counts from normalized expression, preserves compatible metadata and embeddings, and reports when a target format cannot represent part of the source object.

| From | To | Status | | -------------------- | -------------------- | ------------------------------- | | Seurat | AnnData | Supported | | AnnData | Seurat | Supported | | Seurat | SingleCellExperiment | Supported | | SingleCellExperiment | Seurat | Supported | | SingleCellExperiment | AnnData | Supported | | AnnData | SingleCellExperiment | Supported | | Seurat | Loom | Supported with Loom limitations | | Loom | Seurat | Supported with Loom limitations | | SingleCellExperiment | Loom | Supported with Loom limitations | | Loom | SingleCellExperiment | Supported with Loom limitations | | AnnData | Loom | Supported with Loom limitations | | Loom | AnnData | Supported with Loom limitations |
Loom has a smaller and increasingly legacy data model. scFlex supports it as an interchange format but does not claim lossless preservation of components Loom cannot represent.
# install.packages("remotes")
remotes::install_github("mohamednhassan/scFlex")
scFlex does not require a hard-coded Conda environment. It declares its Python requirements through reticulate::py_require() and lets reticulate resolve them in the user's Python configuration.
For AnnData conversion, scFlex declares anndata>=0.10. Loom conversion additionally declares loompy>=3.0 only when Loom support is used.
Before conversion, inspect the input object to understand its structure and available components.
inspect_sc("object.rds")
inspect_sc("object.h5ad")
inspect_sc("object.loom")
inspect_sc() reports the detected object structure, including information such as assays/layers, dimensions, metadata, and dimensional reductions, without assigning a subjective conversion score.
convert_sc()After inspection, use the general convert_sc() interface:
convert_sc(
input = "object.rds",
output = "object.h5ad",
source = "seurat",
destination = "anndata"
)
Another example:
convert_sc(
input = "object.h5ad",
output = "object_sce.rds",
source = "anndata",
destination = "sce"
)
Format-specific conversion functions are also available:
convert_seurat_to_anndata("object.rds", "object.h5ad")
convert_anndata_to_seurat("object.h5ad", "object.rds")
convert_seurat_to_sce("object.rds", "object_sce.rds")
convert_sce_to_seurat("object_sce.rds", "object.rds")
convert_sce_to_anndata("object_sce.rds", "object.h5ad")
convert_anndata_to_sce("object.h5ad", "object_sce.rds")
convert_anndata_to_loom("object.h5ad", "object.loom")
convert_loom_to_anndata("object.loom", "object.h5ad")
scFlex also provides helper functions for converting between classic Seurat Assay objects and Seurat v5 Assay5 objects.
convert_seu_v5_to_classic(
input = "object.rds",
output = "object_classic.rds",
assay = "RNA"
)
convert_seu_classic_to_v5(
input = "object.rds",
output = "object_v5.rds",
assay = "RNA"
)
These functions are useful when working with tools or workflows that expect a particular Seurat assay structure.
Typical mappings include:
| Concept | Seurat | AnnData | SingleCellExperiment |
| --------------------- | -------------- | ------------------ | -------------------- |
| Raw counts | counts | layers["counts"] | assay("counts") |
| Normalized expression | data | X | assay("logcounts") |
| Cell metadata | meta.data | obs | colData |
| Feature metadata | assay metadata | var | rowData |
| Embeddings | reductions | obsm | reducedDims |
scFlex recognizes both canonical layers such as counts/data and split Seurat v5 layers such as:
counts.sample1
counts.sample2
data.sample1
data.sample2
Matching split layers are joined internally on a temporary assay for conversion; the input object is not modified.
Counts-only Seurat objects are also valid conversion inputs. When normalized expression is absent, AnnData X is populated with the raw counts without normalization, and the conversion result reports this explicitly.
devtools::document()
devtools::test()
devtools::check()
Version 0.1.0 focuses on expression matrices, cell/feature metadata, and dimensional reductions. Graphs, neighbors, Seurat command history, variable-feature state, feature loadings, multimodal altExp/MuData mapping, and spatial structures are not yet guaranteed to round-trip.
MIT.
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.