Learn R Programming

crochet (version 2.3.0)

extract: Create an Implementation of [ For Custom Matrix-Like Types

Description

extract is a function that converts different index types such as negative integer vectors, character vectors, or logical vectors passed to the [ function as i (e.g. X[i]) or i and j (e.g. X[i, j]) into positive integer vectors. The converted indices are provided as the i parameter of extract_vector or i and j parameters of extract_matrix to facilitate implementing the extraction mechanism for custom matrix-like types.

Usage

extract(extract_vector, extract_matrix, allowDoubles = FALSE)

Arguments

extract_vector

A function in the form of function(x, i, ...) that takes a subset of x based on a single index i and returns a vector.

extract_matrix

A function in the form of function(x, i, j, ...) that takes a subset of x based on two indices i and j and returns a matrix.

allowDoubles

If set, indices of type double are not converted to integers if the operation would overflow to support matrices with nrow(), ncol(), or length() greater than the largest integer that can be represented (.Machine$integer.max).

Value

A function in the form of function(x, i, j, ..., drop = TRUE) that is meant to be used as a method for [ for a custom type.

Details

The custom type must implement methods for length, dim and dimnames for this function to work. Implementing methods for nrow, ncol, rownames, and colnames is not necessary as the default method of those generics calls dim or dimnames internally.

Optional arguments are supported and will be passed to extract_vector and extract_matrix as long as they are named.

See Also

vignette("StringMatrix", package = "crochet") for a vignette containing a complete example on how to use extract to implement [ for a custom type.

Examples

Run this code
# NOT RUN {
b <- matrix(data = rnorm(25), nrow = 5, ncol = 5)
dimnames(b) <- list(letters[1:5], letters[1:5])

a <- structure(list(), class = "TestMatrix")

dim.TestMatrix <- function(x) {
    dim(b)
}

dimnames.TestMatrix <- function(x) {
    dimnames(b)
}

extract_vector <- function(x, i) {
    # Dispatch to b instead to x for this demo
    b[i, drop = FALSE]
}

extract_matrix <- function(x, i, j) {
    # Dispatch to b instead to x for this demo
    b[i, j, drop = FALSE]
}

`[.TestMatrix` <- extract(extract_vector = extract_vector, extract_matrix = extract_matrix)
# }

Run the code above in your browser using DataLab