replace {crochet} | R Documentation |
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)