| Version: | 2.3.0 |
| License: | MIT + file LICENSE |
| Title: | Implementation Helper for '[' and '[<-' of Custom Matrix-Like Types |
| Description: | Functions to help implement the extraction / subsetting / indexing function '[' and replacement function '[<-' of custom matrix-like types (based on S3, S4, etc.), modeled as closely to the base matrix class as possible (with tests to prove it). |
| URL: | https://github.com/agrueneberg/crochet |
| BugReports: | https://github.com/agrueneberg/crochet/issues |
| Depends: | R (≥ 3.0.0) |
| Imports: | methods |
| Suggests: | tinytest, knitr, rmarkdown |
| VignetteBuilder: | knitr |
| NeedsCompilation: | no |
| Packaged: | 2020-05-19 21:15:31 UTC; agrueneberg |
| Author: | Alexander Grueneberg [aut, cre] |
| Maintainer: | Alexander Grueneberg <cran@agrueneberg.info> |
| Repository: | CRAN |
| Date/Publication: | 2020-05-20 22:40:02 UTC |
Implementation Helper for '[' and '[<-' of Custom Matrix-Like Types
Description
Functions to help implement the extraction / subsetting / indexing function '[' and replacement function '[<-' of custom matrix-like types (based on S3, S4, etc.), modeled as closely to the base matrix class as possible (with tests to prove it).
Important Functions
extract:-
Create an implementation of
[for custom matrix-like types. replace:-
Create an implementation of
[<-for custom matrix-like types. convertIndex:-
Convert non-numeric index types to positive integers.
Discussion
R used to export functions for index conversion such as
makeSubscript, vectorSubscript, and arraySubscript in
src/main/subscript.c to package developers until R 2.3.1. These
exports were removed in R 2.4.0 as part of a
cleanup.
arraySubscript was later
re-added
as some packages such as arules and cba still rely on it. I still need to
investigate whether arraySubscript would be useful for this package.
See Also
vignette("StringMatrix", package = "crochet") for a vignette
containing a full example for a custom type.
Convert Non-Numeric Index Types to Positive Integers
Description
Converts different index types such as negative integer vectors, character vectors, or logical vectors into positive integer vectors.
Usage
convertIndex(x, i, type, allowDoubles = FALSE)
Arguments
x |
A matrix-like object. |
i |
The index to convert: may be a one-dimensional or two-dimensional logical, character, integer, or double vector. |
type |
The type of index to convert to: |
allowDoubles |
If set, indices of type double are not converted to integers if the
operation would overflow to support matrices with |
Value
The converted index.
See Also
extract and replace to generate implementations
for [ and [<- for custom types that use convertIndex
under the hood.
Examples
x <- matrix(data = rnorm(25), nrow = 5, ncol = 5)
dimnames(x) <- list(letters[1:5], letters[1:5])
convertIndex(x, c(1, 2, 3), "k")
convertIndex(x, -25, "k")
convertIndex(x, c(TRUE, FALSE), "k")
convertIndex(x, c(1, 2, 3), "i")
convertIndex(x, -5, "i")
convertIndex(x, c(TRUE, FALSE), "i")
convertIndex(x, c("a", "b", "c"), "i")
convertIndex(x, c(1, 2, 3), "j")
convertIndex(x, -5, "j")
convertIndex(x, c(TRUE, FALSE), "j")
convertIndex(x, c("a", "b", "c"), "j")
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 |
extract_matrix |
A function in the form of |
allowDoubles |
If set, indices of type double are not converted to integers if the
operation would overflow to support matrices with |
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.
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.
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
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)
Convert Two-Dimensional Indices i and j to One-Dimensional Index k
Description
ijtok is a helper function that converts two-dimensional indices
i and j to a one-dimensional index k. This can be
useful if, for example, one-dimensional indexing is easier to implement
than two-dimensional indexing.
Usage
ijtok(x, i, j)
Arguments
x |
A matrix-like object. |
i |
The first component of a two-dimensional index. |
j |
The second component of a two-dimensional index. |
Details
It is assumed that all indices are one-based.
Value
A one-dimensional index.
Convert One-Dimensional Index k to Two-Dimensional Indices i and j
Description
ktoij is a helper function that converts a one-dimensional index
k to two-dimensional indices i and j. This can be
useful if, for example, two-dimensional indexing is easier to implement
than one-dimensional indexing.
Usage
ktoij(x, k)
Arguments
x |
A matrix-like object. |
k |
A one-dimensional index. |
Details
It is assumed that all indices are one-based.
Value
A list containing indices i and j.
Create an Implementation of [<- For Custom Matrix-Like Types
Description
replace 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 replace_vector or
i and j parameters of replace_matrix to facilitate
implementing the replacement mechanism for custom matrix-like types. Values
are recycled to match the replacement length.
Usage
replace(replace_vector, replace_matrix, allowDoubles = FALSE)
Arguments
replace_vector |
A function in the form of |
replace_matrix |
A function in the form of |
allowDoubles |
If set, indices of type double are not converted to integers if the
operation would overflow to support matrices with |
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.
Value
A function in the form of function(x, i, j, ..., value) that is
meant to be used as a method for [<- for a custom type.
See Also
vignette("StringMatrix", package = "crochet") for a vignette
containing a complete example on how to use replace to implement
[<- for a custom type.
Examples
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)
replace_vector <- function(x, i, value) {
.GlobalEnv$i <- i
.GlobalEnv$value <- value
# Dispatch to b instead to x for this demo
with(.GlobalEnv, b[i] <- value)
# Don't forget to return x
return(x)
}
replace_matrix <- function(x, i, j, value) {
.GlobalEnv$i <- i
.GlobalEnv$j <- j
.GlobalEnv$value <- value
# Dispatch to b instead to x for this demo
with(.GlobalEnv, b[i, j] <- value)
# Don't forget to return x
return(x)
}
`[<-.TestMatrix` <- replace(replace_vector = replace_vector, replace_matrix = replace_matrix)