Checked on 2026-11-09. Each entry gives where the package lives, what it is built on, and what it does with Zarr. Facts are marked:
Sources:
q=zarr, 34 hits);available.packages();Versions in the probe can trail the published ones. Those are noted where they matter.
These packages all go through the same GDAL Zarr and Icechunk drivers, so their spec coverage is GDAL’s (see gdal.md). They differ in two things:
rast() uses the classic API by default. Its signature includes md and
dims (V), which open through the multidim API and pick dimensions.sds() lists subdatasets. writeRaster() writes Zarr through GDAL
CreateCopy (I).stars 0.7-3 and sf 1.1-3.stars::read_mdim() and write_mdim() sit on sf::gdal_read_mdim() and
gdal_write_mdim() (V, exports).read_mdim() uses the GDAL multidim API and supports offset, count,
step and proxy (V, signature).[row, col] (V, probe).vapour_read_raster(), vapour_raster_info() and
vapour_sds_names(), plus the warper (gdal_raster_data(),
vapour_warp_raster()).gdal_raster_data() refused stores without georeferencing (they “could not
be processed with GDALWarp api”). Use vapour_read_raster() for those (V).GDALRaster plus multidim utilities: mdim_info(),
mdim_as_classic() and mdim_translate() (V, exports).mdim_as_classic(dsn, array_name, idx_xdim, idx_ydim) gives a classic
GDALRaster view of any 2D slice of an MDArray.gdalmultidim-api branch (mdsumner/gdalraster, last merged with
main 2026-06-16) adds a full Rcpp-module class GDALMultiDimRaster (V,
R/gdalmultidim.R) and about 6,100 lines (V, diff stat):
GDALGroupR, GDALMDArrayR, GDALDimensionR,
GDALAttributeR and GDALExtendedDataTypeR;$getRootGroup(), $getArrayNames(), $openArray(),
$openArrayFromFullname(), $openSubGroup(), $createGroup(), metadata
and $info();mdim_read(), mdim_read_info(),
mdim_read_dim_values(), mdim_read_coord_info(),
mdim_read_array_attrs() and mdim_read_group_attrs().Related branches: multidimnew, as-classic-mdim-factory, multidim. The
branch is not installed here and was not probed.
gdal_open(path, multidim = TRUE),
get_root_group(), open_group(), open_mdarray(), mdarray_info(),
read_mdarray(x, start, count, step), get_view(arr, "[0,:,:]") and
as_mdarray() (V).advise_read() sends GDAL a batch read hint, so Zarr decodes the chunks it
touches on GDAL_NUM_THREADS threads (V, docs).as_altarr() gives a lazy, chunk-cached ALTREP array (V).multidim.zarr example.t) (V).CopernicusMarine (CRAN 0.5.0; 0.4.6.0002 checked locally) uses the
multidim API, through stars. It has no Zarr reader of its own in
0.4.6. Evidence (V, function bodies):
cms_download_subset() and cms_zarr_proxy() open a stars mdim proxy
on a /vsi* URI, subset by dimension values, then call st_as_stars();GDAL_NUM_THREADS=ALL_CPUS, GDAL_HTTP_MULTICURL=YES and
GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR;has_blosc() checks for
it.The same author wrote the CRAN blosc package. Earlier versions may have
decoded chunks themselves (I, not checked). CRAN 0.5.0 was not checked.
cmemsarco (hypertidy, r-universe 0.1.0) is classic API in practice.
It only builds ZARR:"/vsicurl/<url>":/<array> and /vsis3/ strings, and
suggests terra and vapour to read them (V, source).blosc (V).zarr_localstore, zarr_memorystore and zarr_httpstore, plus
S3 (V, exports and agent).zarr_conventions(), zarr_convention_uom() and others
(V).✖ Consolidated metadata).zlib with attempt to set an attribute on NULL. Stores
from both GDAL and Rarr hit this (V).transpose + bytes + blosc(zstd,
bitshuffle), chunk keys c.0.0, and fill value 9.969e36, which is
netCDF’s default (V, fixture).geozarr.zarr.zarrs crate via extendr. It adds
parallel decode, more codecs, object stores, S3, GCS and Icechunk (V,
README and pizzarr_compiled_features()).zarr_open(), zarr_create_group(), zarr_create_array(),
DirectoryStore, HttpStore, S3Store, GcsStore, IcechunkStore and
slice() (V).Unsupported V3 codec: 'sharding_indexed' (the R
codec path, even with zarrs compiled in);transpose with 32x32 chunks over 87x61) reads wrong
values;zarr’s single-chunk transpose store reads correctly (V).order: "F" and zstd. Every reader handled the
F order except NCZarr, which needs codec plugins anyway (V).rnz uses it (V).use_*()) (V).read_zarr_array(), write_zarr_array(zarr_version = 2L|3L),
zarr_overview(), zarr_consolidate_metadata() and attribute helpers (V).paws.storage and curl. No S3 writes and no
sharded writes yet (V, agent).ZarrArray (V).The following codecs are not supported (V). Newer versions may differ.z_demo() and similar) over pizzarr.zarrs crate via savvy..zarr.zip VCF-Zarr (V, README/agent).zarrs via extendr: v2 and v3 read over file, HTTP and S3, with local
write only (V, README).dbConnect() and friends).ic_chunk_refs() and ic_refs_arrow() read a snapshot’s chunk references
as a table. ic_to_byterefs() and ic_repo_from_byterefs() round-trip
Kerchunk-style refs.pizzarr::IcechunkStore as bytes
(ic_session_bytes()).gdalraster
and nanoparquet.zaro(), zaro_read(), zaro_array(), zaro_plan(),
zaro_chunks() and others. Laziness comes from altarr.transpose-codec stores (both zarr’s and Rarr’s), which read
wrong values (V).altarr (hypertidy, 0.1.1) provides lazy chunked arrays as ALTREP vectors
that carry a dim but no class.ndr adds named-dimension arrays with coordinate indexing.zaro and
GDAL7 both use.blocklist builds Kerchunk Parquet reference stores from NetCDF4/HDF5
collections, using gdal mdim mosaic and rhdf5 (V, README).rustycogs virtualises TIFF/COG tiles into byte refs with Rust (V, README).sds is a catalogue of spatial data sources.RNetCDF::open.nc() and
ncdf4::nc_open() open "file:///abs/path.zarr#mode=zarr,file". Use
mode=nczarr for netCDF-flavoured stores, and s3 instead of file when
netCDF-C was built with S3.HDF5_PLUGIN_PATH) (V):
_ARRAY_DIMENSIONS get synthetic _zdim_N
dimensions.Rarr
(V).Rarr, in Suggests (V).Rarr, ZarrArray and duckdb. Companions: SpatialData.data and
SpatialData.plot (V).Rarr,
ZarrArray and rhdf5 (V).X on
Rarr. Its README says Bioc, but it is in neither VIEWS file.zellkonverter (H5AD through Python);RBioFormats;rhdf5/HDF5Array, which are siblings;ncdfCF and CFtime, which belong to the same R-CF org as zarr but
have no Zarr in their DESCRIPTION (V);openeo and rstac.xarray.open_zarr(), zarr-python 3, icechunk, VirtualiZarr and
kerchunk all work through reticulate. Expect numpy C-order to R
F-order conversion and orientation bookkeeping.ezzarr (ez-zarr), muschellij2/zarrr and
hypertidy/zarrr (a 2022 skeleton).ctreesR wraps Arraylake.anndata package (CRAN 0.8.0) is superseded by anndataR.gdalxarray (hypertidy; PyPI 0.5.1, 2026-10-20) is an xarray backend
powered directly by GDAL: xr.open_dataset(path, engine="gdalxarray")
(V, README). From R, through reticulate, it gives xarray’s data model
over GDAL’s multidim API. That covers every GDAL Zarr feature above,
including Kerchunk and Icechunk, plus non-Zarr multidim sources.xrdbi (not detailed yet) is a DBI-style layer that works only through
xarray.