Zarr from R: a capability map

There are many ways to reach a Zarr store from R. They fall into a few families:

This repository gives a broad overview of those families. Measurement is kept light. There is one probe: a write-by-read matrix that runs locally (probe/). Everything else is prose with links: landscape.md covers every package, and gdal.md covers the GDAL tendril by GDAL version and by R binding.

Checked on 2026-11-09 with GDAL 3.14.0dev, netCDF-C 4.9.2 and R 4.6.1. It is modelled loosely on rust-proj-capability.

TL;DR: which one?

The landscape

Versions are the current published ones as of 2026-11-09 (CRAN, Bioc release or devel, r-universe). Details and caveats are in landscape.md.

package where tech Zarr write remote notes
GDAL route            
terra CRAN 1.9-x GDAL classic; rast(md=) mdim v2+v3, all GDAL yes (classic) /vsi* 2D/3D slabs as SpatRaster
stars (+sf) CRAN 0.7-3 GDAL mdim (read_mdim, write_mdim) v2+v3 yes /vsi* arrays come back in x,y order (transposed)
vapour CRAN 0.16 GDAL classic and warper v2+v3 limited /vsi* raw read and warp of ZARR: DSNs
gdalraster CRAN 2.7.0 GDAL classic + mdim_info, mdim_as_classic, mdim_translate v2+v3 yes /vsi* full GDALMultiDimRaster class on the gdalmultidim-api branch
GDAL7 GitHub rgdal-dev/GDAL7 SWIG-derived cpp11 + S7 bindings v2+v3 classic only /vsi* GDALGroup and GDALMDArray, get_view, advise_read, ALTREP as_altarr
gdalcubes CRAN 0.7.6 GDAL classic only per GDAL no /vsi* Zarr as a 2D-band cube source
CopernicusMarine CRAN 0.5.0 GDAL mdim, through a stars proxy ARCO no HTTP/S3 needs GDAL 3.11+ with BLOSC; no native reader (0.4.6)
cmemsarco r-universe hypertidy GDAL classic (ZARR: DSN strings for terra/vapour) ARCO no /vsicurl/, /vsis3/  
native R            
zarr CRAN 1.0.1 (R-CF) R6 + Rcpp, blosc v3 core, reads v2 yes memory, file, HTTP, S3 sharding; no consolidated metadata; extensible stores and codecs
geozarr CRAN 0.3.0 (R-CF) on zarr per zarr yes per zarr GeoZarr conventions
pizzarr CRAN 0.2.1; r-universe 0.2.2 pure R; r-universe adds Rust zarrs v2+v3 yes HTTP; S3/GCS (zarrs) IcechunkStore handoff from icechunkr
Rarr Bioc 2.0.1 / devel 2.1.57 R + bundled C codecs v2+v3 yes (local) S3/HTTP (paws) DelayedArray layer moved to ZarrArray
rnz GitHub DOI-USGS/rnz on pizzarr v2+v3 no HTTP RNetCDF-like API
Rust-backed            
Rzarrs r-universe RGenomicsETL zarrs via savvy v3 (+v2) read-first file, HTTP, S3 VCF-Zarr, .zarr.zip, sharding
zr GitHub mdsumner/zr zarrs via extendr v2+v3 local only file, HTTP, S3 experimental
icechunkr private (mdsumner/icechunk-r), in development Rust icechunk via extendr Icechunk (v3) yes: repos, sessions, commits local, S3, GCS, Azure, HTTP DBI interface; chunk refs as tables; sessions handed to pizzarr
Arrow / byte references            
zaro r-universe hypertidy R + Arrow filesystems; optional gdalraster v2+v3, sharded no HTTP, S3, GCS Kerchunk JSON/Parquet, VirtualiZarr manifests; lazy via altarr
blocklist r-universe hypertidy GDAL mdim mosaic + rhdf5 writes Kerchunk Parquet refs - builds virtual stores from NetCDF4/HDF5
NCZarr            
RNetCDF, ncdf4 CRAN netCDF-C NCZarr v2 (4.9.2) yes S3 if netCDF-C built so file://...#mode=zarr; codecs need HDF5 filter plugins
Bioconductor / domain            
ZarrArray Bioc 1.0.1 DelayedArray on Rarr per Rarr - per Rarr  
anndataR Bioc 1.2.3 Rarr (Suggests) per Rarr yes   AnnData .zarr
spatialdataR, ImageArray Bioc devel / 1.0.0 Rarr + ZarrArray per Rarr     SpatialData, OME-NGFF pyramids
romeo, OMERarr, VoltRon, ZarrDataFrame, ZarrSparseMatrix r-universe / GitHub mostly on Rarr       OME-Zarr and single-cell; early
lstar CRAN 0.2.2 C++17 own v3 schema yes   single-cell; not a general reader
Python            
reticulate CRAN xarray, zarr-python, icechunk everything Python does yes everything plus thin wrappers: ezzarr, muschellij2/zarrr, ctreesR
gdalxarray PyPI 0.5.1 (hypertidy) xarray backend over GDAL multidim all GDAL no /vsi* xarray’s model on GDAL’s driver, reachable from R through reticulate; xrdbi sits on xarray too

blosc (CRAN 0.1.2) is the shared codec dependency of zarr and pizzarr.

What the probe shows

We wrote volcano (87 x 61, float64) with 10 writer configurations and read each store with 10 readers. Full grid and caveats: probe/README.md.

What no R route does yet (as far as we found)

Layout

To rerun the probe:

Rscript probe/probe.R