From bc481b15c520693515654ec475a6a082b3c72404 Mon Sep 17 00:00:00 2001 From: Paul Hoffman Date: Fri, 16 Feb 2024 20:34:57 -0500 Subject: [PATCH] [r] [WIP] Blockwise Reader Initial support for blockwise reader/iteration New classes: - `CoordsStrider`: new class to iterate through coordinate similar to Python's `_coords_strider` - `SOMASparseNDArrayReadBase`: base class for sparse array reads - `SOMASparseNDArrayBlockwiseRead`: new reader class for blockwise iterated reads New SOMA methods: - `SOMASparseNDArrayRead$blockwse()`: perform a blockwise read addresses #1853 --- apis/r/DESCRIPTION | 6 +- apis/r/NAMESPACE | 9 + apis/r/R/CoordsStrider.R | 129 ++++++++++++ apis/r/R/SOMASparseNDArray.R | 2 +- apis/r/R/SOMASparseNDArrayRead.R | 209 +++++++++++++++++-- apis/r/man/SOMASparseNDArrayBlockwiseRead.Rd | 107 ++++++++++ apis/r/man/SOMASparseNDArrayRead.Rd | 61 +++--- apis/r/man/SOMASparseNDArrayReadBase.Rd | 50 +++++ apis/r/man/reexports.Rd | 19 ++ 9 files changed, 545 insertions(+), 47 deletions(-) create mode 100644 apis/r/R/CoordsStrider.R create mode 100644 apis/r/man/SOMASparseNDArrayBlockwiseRead.Rd create mode 100644 apis/r/man/SOMASparseNDArrayReadBase.Rd create mode 100644 apis/r/man/reexports.Rd diff --git a/apis/r/DESCRIPTION b/apis/r/DESCRIPTION index 59476a0f10..3cd94b2166 100644 --- a/apis/r/DESCRIPTION +++ b/apis/r/DESCRIPTION @@ -45,14 +45,16 @@ Imports: spdl, rlang, tools, - tibble + tibble, + itertools, + iterators LinkingTo: Rcpp, RcppSpdlog, RcppInt64 Additional_repositories: https://ghrr.github.io/drat Roxygen: list(markdown = TRUE) -RoxygenNote: 7.2.3 +RoxygenNote: 7.3.1 Suggests: rmarkdown, knitr, diff --git a/apis/r/NAMESPACE b/apis/r/NAMESPACE index 2607cb7deb..d1f7d97944 100644 --- a/apis/r/NAMESPACE +++ b/apis/r/NAMESPACE @@ -2,9 +2,12 @@ S3method("[[",MappingBase) S3method("[[<-",MappingBase) +S3method(as.list,CoordsStrider) S3method(as.list,MappingBase) +S3method(hasNext,CoordsStrider) S3method(length,MappingBase) S3method(names,MappingBase) +S3method(nextElem,CoordsStrider) S3method(write_soma,Assay) S3method(write_soma,DataFrame) S3method(write_soma,DimReduc) @@ -51,9 +54,11 @@ export(SOMAMeasurementOpen) export(SOMANDArrayBase) export(SOMAOpen) export(SOMASparseNDArray) +export(SOMASparseNDArrayBlockwiseRead) export(SOMASparseNDArrayCreate) export(SOMASparseNDArrayOpen) export(SOMASparseNDArrayRead) +export(SOMASparseNDArrayReadBase) export(SOMATileDBContext) export(ScalarMap) export(SparseReadIter) @@ -63,9 +68,11 @@ export(TileDBCreateOptions) export(TileDBGroup) export(TileDBObject) export(extract_dataset) +export(hasNext) export(list_datasets) export(load_dataset) export(matrixZeroBasedView) +export(nextElem) export(set_log_level) export(show_package_versions) export(tiledbsoma_stats_disable) @@ -88,6 +95,8 @@ importFrom(data.table,address) importFrom(fs,path_has_parent) importFrom(fs,path_rel) importFrom(glue,glue_collapse) +importFrom(iterators,nextElem) +importFrom(itertools,hasNext) importFrom(methods,as) importFrom(methods,getClassDef) importFrom(methods,new) diff --git a/apis/r/R/CoordsStrider.R b/apis/r/R/CoordsStrider.R new file mode 100644 index 0000000000..6e75f0860b --- /dev/null +++ b/apis/r/R/CoordsStrider.R @@ -0,0 +1,129 @@ +CoordsStrider <- R6::R6Class( + classname = "CoordsStrider", + cloneable = FALSE, + public = list( + initialize = function(coords, ..., stride = NULL, start = NULL, end = NULL) { + if (missing(coords)) { + stopifnot( + rlang::is_integerish(start, 1L, TRUE) || + (inherits(start, "integer64") && length(start) == 1L && is.finite(start)), + rlang::is_integerish(end, 1L, TRUE) || + (inherits(end, "integer64") && length(end) == 1L && is.finite(end)), + start <= end + ) + private$.start <- start + private$.end <- end + stride <- stride %||% abs(end - start + 1L) + private$.index <- 0L + } else { + stopifnot(inherits(coords, c("integer64", "numeric", "integer"))) + private$.coords <- coords + stride <- stride %||% length(coords) + stopifnot(stride <= .Machine$integer.max) + private$.index <- 1L + } + stopifnot(rlang::is_integerish(stride, 1L, TRUE) && stride > 0L) + private$.stride <- stride + }, + print = function() { + cat("<", class(self)[1L], ">\n", sep = "") + if (is.null(self$coords)) { + cat(" start:", self$start, "\n") + cat(" end:", self$end, "\n") + } else { + cat(" length(coords):", length(self$coords), "\n") + } + cat(" stride:", self$stride, "\n") + return(invisible(self)) + }, + hasNext = function() { + if (is.null(self$coords)) { + return(private$.index <= abs(self$end - self$start)) + } + return(private$.index <= length(self$coords)) + }, + nextElem = function() { + if (!self$hasNext()) { + private$.stopIteration() + } + if (is.null(self$coords)) { + start <- min(self$start + private$.index, self$end) + end <- min(start + self$stride - 1L, self$end) + private$.index <- private$.index + self$stride + if (start == end) { + return(bit64::as.integer64(start)) + } + by <- ifelse(start <= end, 1L, -1L) + return(bit64::seq.integer64(from = start, to = end, by = by)) + } + start <- private$.index + end <- min(private$.index + self$stride - 1L, length(self$coords)) + private$.index <- end + 1 + return(self$coords[start:end]) + } + ), + active = list( + coords = function() private$.coords, + start = function() ifelse(is.null(self$coords), private$.start, min(self$coords)), + end = function() ifelse(is.null(self$coords), private$.end, max(self$coords)), + stride = function() private$.stride + ), + private = list( + .coords = NULL, + .start = NULL, + .end = NULL, + .stride = NULL, + .index = NULL, + .stopIteration = function() stop(errorCondition( + "StopIteration", + class = "stopIteration" + )) + ) +) + +#' @method as.list CoordsStrider +#' @export +#' +as.list.CoordsStrider <- function(x, ...) { + f <- get('as.list.iter', envir = asNamespace('iterators')) + return(f(x, ...)) +} + +#' @importFrom iterators nextElem +#' @export +#' +iterators::nextElem + +#' @method nextElem CoordsStrider +#' @export +#' +nextElem.CoordsStrider <- function(obj, ...) { + return(obj$nextElem()) +} + +#' @importFrom itertools hasNext +#' @export +#' +itertools::hasNext + +#' @method hasNext CoordsStrider +#' @export +#' +hasNext.CoordsStrider <- function(obj, ...) { + return(obj$hasNext()) +} + +unlist64 <- function(x) { + stopifnot( + is.list(x), + all(vapply_lgl(x, inherits, what = 'integer64')) + ) + res <- bit64::integer64(sum(vapply_int(x, length))) + idx <- 1L + for (i in seq_along(x)) { + end <- idx + length(x[[i]]) + res[idx:(end - 1L)] <- x[[i]] + idx <- end + } + return(res) +} diff --git a/apis/r/R/SOMASparseNDArray.R b/apis/r/R/SOMASparseNDArray.R index f6dd6e85f1..13d94e26ac 100644 --- a/apis/r/R/SOMASparseNDArray.R +++ b/apis/r/R/SOMASparseNDArray.R @@ -54,7 +54,7 @@ SOMASparseNDArray <- R6::R6Class( timestamp_end = private$tiledb_timestamp, loglevel = log_level) private$ctx_ptr <- rl$ctx - SOMASparseNDArrayRead$new(rl$sr, shape = self$shape()) + SOMASparseNDArrayRead$new(rl$sr, self, coords) }, #' @description Write matrix-like data to the array. (lifecycle: experimental) diff --git a/apis/r/R/SOMASparseNDArrayRead.R b/apis/r/R/SOMASparseNDArrayRead.R index b2a9ad1ac1..7eb9c78658 100644 --- a/apis/r/R/SOMASparseNDArrayRead.R +++ b/apis/r/R/SOMASparseNDArrayRead.R @@ -1,3 +1,75 @@ +#' SOMA Sparse ND-Array Reader Base +#' +#' @description Base class for SOMA sparse ND-array reads +#' +#' @keywords internal +#' +#' @export +#' +SOMASparseNDArrayReadBase <- R6::R6Class( + classname = "SOMASparseNDArrayReadBase", + cloneable = FALSE, + public = list( + #' @description Create + #' + #' @param sr SOMA read pointer + #' @param array \code{\link{SOMASparseNDArray}} + #' @param coords ... + # @param shape Shape of the full matrix + #' + initialize = function(sr, array, coords) { + stopifnot( + "'array' must be a SOMASparseNDArray" = inherits(array, "SOMASparseNDArray") + ) + if (is.null(coords)) { + private$.striders <- vector(mode = "list", length = array$ndim()) + shape <- array$shape() + for (i in seq_along(private$.striders)) { + private$.striders[[i]] <- CoordsStrider$new( + start = 0L, + end = shape[i], + stride = .Machine$integer.max + ) + } + names(private$.striders) <- array$dimnames() + # shape <- array$shape() + # coords <- vector(mode = "list", length = array$ndim()) + # for (i in seq_along(coords)) { + # coords[[i]] <- bit64::seq.integer64(0L, shape[i] - 1L) + # } + # names(coords) <- array$dimnames() + } else { + stopifnot( + "'coords' must be a list of integer64 values" = is.list(coords) && + all(vapply_lgl(coords, inherits, what = c('integer64', 'numeric'))), + "'coords' must be named with the dimnames of 'array'" = is_named(coords, FALSE) && + all(names(coords) %in% array$dimnames()) + ) + private$.coords <- coords + } + private$.sr <- sr + private$.array <- array + # private$.shape <- shape + } + ), + active = list( + #' @field sr The SOMA read pointer + sr = function() return(private$.sr), + #' @field array The underlying \code{\link{SOMASparseNDArray}} + array = function() return(private$.array), + #' @field coords The coordinates for the read + coords = function() return(private$.coords), + #' @field shape The shape of the underlying array + shape = function() return(self$array$shape()) + ), + private = list( + .sr = NULL, + .array = NULL, + .coords = NULL, + .striders = NULL + ) +) + #' SOMASparseNDArrayRead #' #' @description @@ -7,16 +79,17 @@ SOMASparseNDArrayRead <- R6::R6Class( classname = "SOMASparseNDArrayRead", - + inherit = SOMASparseNDArrayReadBase, + cloneable = FALSE, public = list( - #' @description Create (lifecycle: experimental) - #' @param sr soma read pointer - #' @param shape Shape of the full matrix - initialize = function(sr, shape) { - private$sr <- sr - private$shape <- shape - }, + # @description Create (lifecycle: experimental) + # @param sr soma read pointer + # @param shape Shape of the full matrix + # initialize = function(sr, shape) { + # private$sr <- sr + # private$shape <- shape + # }, #' @description Read as a sparse matrix (lifecycle: experimental). Returns #' an iterator of Matrix::\link[Matrix]{dgTMatrix-class} or \link{matrixZeroBasedView} of it. @@ -26,8 +99,9 @@ SOMASparseNDArrayRead <- R6::R6Class( sparse_matrix = function(zero_based=FALSE) { #TODO implement zero_based argument, currently doesn't do anything - - if (any(private$shape > .Machine$integer.max)) { + shape <- self$shape + # if (any(private$shape > .Machine$integer.max)) { + if (any(shape > .Machine$integer.max)) { warning( "Array's shape exceeds '.Machine$integer.max'.\n", " - Result will only include coordinates within [0, 2^31 - 1).\n", @@ -35,23 +109,124 @@ SOMASparseNDArrayRead <- R6::R6Class( call. = FALSE, immediate. = TRUE ) - private$shape <- pmin(private$shape, .Machine$integer.max) + # private$shape <- pmin(private$shape, .Machine$integer.max) + shape <- pmin(shape, .Machine$integer.max) } - SparseReadIter$new(private$sr, private$shape, zero_based = zero_based) + SparseReadIter$new(self$sr, shape, zero_based = zero_based) }, #' @description Read as a arrow::\link[arrow]{Table} (lifecycle: experimental). #' Returns an iterator of arrow::\link[arrow]{Table}. #' @return \link{TableReadIter} tables = function() { - TableReadIter$new(private$sr) + TableReadIter$new(self$sr) + }, + #' @description ... + #' + #' @param axis ... + #' @param ... Ignored + #' @param size ... + #' @param reindex_disable_on_axis ... + #' @param eager ... + #' + #' @return A \code{\link{SOMASparseNDArrayBlockwiseRead}} iterated reader + #' + blockwise = function( + axis, + ..., + size = NULL, + reindex_disable_on_axis = NULL, + eager = TRUE + ) { + return(SOMASparseNDArrayBlockwiseRead$new( + self$sr, + self$array, + self$coords, + axis, + size = size, + reindex_disable_on_axis = reindex_disable_on_axis, + eager = eager + )) } - ), + ) +) +#' Blockwise Sparse ND-Array Reader +#' +#' @description Blockwise reader for \code{\link{SOMASparseNDArray}} +#' +#' @keywords internal +#' +#' @export +#' +SOMASparseNDArrayBlockwiseRead <- R6::R6Class( + classname = "SOMASparseNDArrayBlockwiseRead", + inherit = SOMASparseNDArrayReadBase, + cloneable = FALSE, + public = list( + #' @description Create + #' + #' @param sr SOMA read pointer + #' @param array \code{\link{SOMASparseNDArray}} + #' @param coords ... + #' @param axis ... + #' @param ... Ignored + #' @param size ... + #' @param reindex_disable_on_axis ... + #' @param eager ... + #' + initialize = function( + sr, + array, + coords, + axis, + ..., + size, + reindex_disable_on_axis, + eager = TRUE + ) { + super$initialize(sr, array, coords) + stopifnot() + private$.axis <- axis + private$.size <- size + private$.reindex_disable_on_axis <- reindex_disable_on_axis + private$.eager <- eager + }, + #' @description ... + #' + #' @return ... + #' + tables = function() { + .NotYetImplemented() + }, + #' @description ... + #' + #' @param compress ... + #' + #' @return ... + #' + sparse_matrix = function(compress = TRUE) { + stopifnot( + "'compress' must be TRUE or FALSE" = isTRUE(compress) || isFALSE(compress) + ) + .NotYetImplemented() + } + ), + active = list( + #' @field axis ... + axis = function() return(private$.axis), + #' @field size ... + size = function() return(private$.size), + #' @field reindex_disable_on_axis ... + reindex_disable_on_axis = function() return(private$.reindex_disable_on_axis), + #' @field eager ... + eager = function() return(private$eager) + ), private = list( - sr=NULL, - shape=NULL + .axis = NULL, + .size = NULL, + .reindex_disable_on_axis = NULL, + .eager = NULL ) - ) diff --git a/apis/r/man/SOMASparseNDArrayBlockwiseRead.Rd b/apis/r/man/SOMASparseNDArrayBlockwiseRead.Rd new file mode 100644 index 0000000000..949f8ccd7f --- /dev/null +++ b/apis/r/man/SOMASparseNDArrayBlockwiseRead.Rd @@ -0,0 +1,107 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/SOMASparseNDArrayRead.R +\name{SOMASparseNDArrayBlockwiseRead} +\alias{SOMASparseNDArrayBlockwiseRead} +\title{Blockwise Sparse ND-Array Reader} +\description{ +Blockwise reader for \code{\link{SOMASparseNDArray}} +} +\keyword{internal} +\section{Super class}{ +\code{\link[tiledbsoma:SOMASparseNDArrayReadBase]{tiledbsoma::SOMASparseNDArrayReadBase}} -> \code{SOMASparseNDArrayBlockwiseRead} +} +\section{Active bindings}{ +\if{html}{\out{
}} +\describe{ +\item{\code{axis}}{...} + +\item{\code{size}}{...} + +\item{\code{reindex_disable_on_axis}}{...} + +\item{\code{eager}}{...} +} +\if{html}{\out{
}} +} +\section{Methods}{ +\subsection{Public methods}{ +\itemize{ +\item \href{#method-SOMASparseNDArrayBlockwiseRead-new}{\code{SOMASparseNDArrayBlockwiseRead$new()}} +\item \href{#method-SOMASparseNDArrayBlockwiseRead-tables}{\code{SOMASparseNDArrayBlockwiseRead$tables()}} +\item \href{#method-SOMASparseNDArrayBlockwiseRead-sparse_matrix}{\code{SOMASparseNDArrayBlockwiseRead$sparse_matrix()}} +} +} +\if{html}{\out{
}} +\if{html}{\out{}} +\if{latex}{\out{\hypertarget{method-SOMASparseNDArrayBlockwiseRead-new}{}}} +\subsection{Method \code{new()}}{ +Create +\subsection{Usage}{ +\if{html}{\out{
}}\preformatted{SOMASparseNDArrayBlockwiseRead$new( + sr, + array, + coords, + axis, + ..., + size, + reindex_disable_on_axis, + eager = TRUE +)}\if{html}{\out{
}} +} + +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{sr}}{SOMA read pointer} + +\item{\code{array}}{\code{\link{SOMASparseNDArray}}} + +\item{\code{coords}}{...} + +\item{\code{axis}}{...} + +\item{\code{...}}{Ignored} + +\item{\code{size}}{...} + +\item{\code{reindex_disable_on_axis}}{...} + +\item{\code{eager}}{...} +} +\if{html}{\out{
}} +} +} +\if{html}{\out{
}} +\if{html}{\out{}} +\if{latex}{\out{\hypertarget{method-SOMASparseNDArrayBlockwiseRead-tables}{}}} +\subsection{Method \code{tables()}}{ +... +\subsection{Usage}{ +\if{html}{\out{
}}\preformatted{SOMASparseNDArrayBlockwiseRead$tables()}\if{html}{\out{
}} +} + +\subsection{Returns}{ +... +} +} +\if{html}{\out{
}} +\if{html}{\out{}} +\if{latex}{\out{\hypertarget{method-SOMASparseNDArrayBlockwiseRead-sparse_matrix}{}}} +\subsection{Method \code{sparse_matrix()}}{ +... +\subsection{Usage}{ +\if{html}{\out{
}}\preformatted{SOMASparseNDArrayBlockwiseRead$sparse_matrix(compress = TRUE)}\if{html}{\out{
}} +} + +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{compress}}{...} +} +\if{html}{\out{
}} +} +\subsection{Returns}{ +... +} +} +} diff --git a/apis/r/man/SOMASparseNDArrayRead.Rd b/apis/r/man/SOMASparseNDArrayRead.Rd index 65820aaf69..62be3f60d8 100644 --- a/apis/r/man/SOMASparseNDArrayRead.Rd +++ b/apis/r/man/SOMASparseNDArrayRead.Rd @@ -7,34 +7,24 @@ Intermediate type to choose result format when reading a sparse array } \keyword{internal} +\section{Super class}{ +\code{\link[tiledbsoma:SOMASparseNDArrayReadBase]{tiledbsoma::SOMASparseNDArrayReadBase}} -> \code{SOMASparseNDArrayRead} +} \section{Methods}{ \subsection{Public methods}{ \itemize{ -\item \href{#method-SOMASparseNDArrayRead-new}{\code{SOMASparseNDArrayRead$new()}} \item \href{#method-SOMASparseNDArrayRead-sparse_matrix}{\code{SOMASparseNDArrayRead$sparse_matrix()}} \item \href{#method-SOMASparseNDArrayRead-tables}{\code{SOMASparseNDArrayRead$tables()}} -\item \href{#method-SOMASparseNDArrayRead-clone}{\code{SOMASparseNDArrayRead$clone()}} -} -} -\if{html}{\out{
}} -\if{html}{\out{}} -\if{latex}{\out{\hypertarget{method-SOMASparseNDArrayRead-new}{}}} -\subsection{Method \code{new()}}{ -Create (lifecycle: experimental) -\subsection{Usage}{ -\if{html}{\out{
}}\preformatted{SOMASparseNDArrayRead$new(sr, shape)}\if{html}{\out{
}} -} - -\subsection{Arguments}{ -\if{html}{\out{
}} -\describe{ -\item{\code{sr}}{soma read pointer} - -\item{\code{shape}}{Shape of the full matrix} -} -\if{html}{\out{
}} +\item \href{#method-SOMASparseNDArrayRead-blockwise}{\code{SOMASparseNDArrayRead$blockwise()}} } } +\if{html}{\out{ +
Inherited methods + +
+}} \if{html}{\out{
}} \if{html}{\out{}} \if{latex}{\out{\hypertarget{method-SOMASparseNDArrayRead-sparse_matrix}{}}} @@ -72,20 +62,37 @@ Returns an iterator of arrow::\link[arrow]{Table}. } } \if{html}{\out{
}} -\if{html}{\out{}} -\if{latex}{\out{\hypertarget{method-SOMASparseNDArrayRead-clone}{}}} -\subsection{Method \code{clone()}}{ -The objects of this class are cloneable with this method. +\if{html}{\out{}} +\if{latex}{\out{\hypertarget{method-SOMASparseNDArrayRead-blockwise}{}}} +\subsection{Method \code{blockwise()}}{ +... \subsection{Usage}{ -\if{html}{\out{
}}\preformatted{SOMASparseNDArrayRead$clone(deep = FALSE)}\if{html}{\out{
}} +\if{html}{\out{
}}\preformatted{SOMASparseNDArrayRead$blockwise( + axis, + ..., + size = NULL, + reindex_disable_on_axis = NULL, + eager = TRUE +)}\if{html}{\out{
}} } \subsection{Arguments}{ \if{html}{\out{
}} \describe{ -\item{\code{deep}}{Whether to make a deep clone.} +\item{\code{axis}}{...} + +\item{\code{...}}{Ignored} + +\item{\code{size}}{...} + +\item{\code{reindex_disable_on_axis}}{...} + +\item{\code{eager}}{...} } \if{html}{\out{
}} } +\subsection{Returns}{ +A \code{\link{SOMASparseNDArrayBlockwiseRead}} iterated reader +} } } diff --git a/apis/r/man/SOMASparseNDArrayReadBase.Rd b/apis/r/man/SOMASparseNDArrayReadBase.Rd new file mode 100644 index 0000000000..033787aa1d --- /dev/null +++ b/apis/r/man/SOMASparseNDArrayReadBase.Rd @@ -0,0 +1,50 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/SOMASparseNDArrayRead.R +\name{SOMASparseNDArrayReadBase} +\alias{SOMASparseNDArrayReadBase} +\title{SOMA Sparse ND-Array Reader Base} +\description{ +Base class for SOMA sparse ND-array reads +} +\keyword{internal} +\section{Active bindings}{ +\if{html}{\out{
}} +\describe{ +\item{\code{sr}}{The SOMA read pointer} + +\item{\code{array}}{The underlying \code{\link{SOMASparseNDArray}}} + +\item{\code{coords}}{The coordinates for the read} + +\item{\code{shape}}{The shape of the underlying array} +} +\if{html}{\out{
}} +} +\section{Methods}{ +\subsection{Public methods}{ +\itemize{ +\item \href{#method-SOMASparseNDArrayReadBase-new}{\code{SOMASparseNDArrayReadBase$new()}} +} +} +\if{html}{\out{
}} +\if{html}{\out{}} +\if{latex}{\out{\hypertarget{method-SOMASparseNDArrayReadBase-new}{}}} +\subsection{Method \code{new()}}{ +Create +\subsection{Usage}{ +\if{html}{\out{
}}\preformatted{SOMASparseNDArrayReadBase$new(sr, array, coords)}\if{html}{\out{
}} +} + +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{sr}}{SOMA read pointer} + +\item{\code{array}}{\code{\link{SOMASparseNDArray}}} + +\item{\code{coords}}{...} +} +\if{html}{\out{
}} +} +} +} diff --git a/apis/r/man/reexports.Rd b/apis/r/man/reexports.Rd new file mode 100644 index 0000000000..835d864f66 --- /dev/null +++ b/apis/r/man/reexports.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/coords_strider.R +\docType{import} +\name{reexports} +\alias{reexports} +\alias{nextElem} +\alias{hasNext} +\title{Objects exported from other packages} +\keyword{internal} +\description{ +These objects are imported from other packages. Follow the links +below to see their documentation. + +\describe{ + \item{iterators}{\code{\link[iterators]{nextElem}}} + + \item{itertools}{\code{\link[itertools]{hasNext}}} +}} +