### =========================================================================
### Array subassignment
### -------------------------------------------------------------------------
###
### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
### Low-level generics to support subassignment of Array derivatives
###
### We define 4 low-level generics that are called by the "[<-" method for
### Array objects defined below in this file. The aim is to falicitate the
### implementation of subassignment operations on array-like S4 objects.
###
setGeneric("subassign_Array_by_logical_array", signature="x",
function(x, y, value) standardGeneric("subassign_Array_by_logical_array")
)
setGeneric("subassign_Array_by_Lindex", signature="x",
function(x, Lindex, value) standardGeneric("subassign_Array_by_Lindex")
)
setGeneric("subassign_Array_by_Mindex", signature="x",
function(x, Mindex, value) standardGeneric("subassign_Array_by_Mindex")
)
setGeneric("subassign_Array_by_Nindex", signature="x",
function(x, Nindex, value) standardGeneric("subassign_Array_by_Nindex")
)
setMethod("subassign_Array_by_logical_array", "Array",
function(x, y, value)
stop(wmsg(class(x)[[1L]], " objects don't support this ",
"form of subassignment at the moment"))
)
setMethod("subassign_Array_by_Lindex", "Array",
function(x, Lindex, value)
stop(wmsg(class(x)[[1L]], " objects don't support this ",
"form of subassignment at the moment"))
)
### Simply delegates to subassign_Array_by_Lindex().
.subassign_Array_by_Mindex <- function(x, Mindex, value)
{
stopifnot(is.matrix(Mindex), is.numeric(Mindex))
subassign_Array_by_Lindex(x, Mindex2Lindex(Mindex, dim(x)), value)
}
setMethod("subassign_Array_by_Mindex", "Array", .subassign_Array_by_Mindex)
setMethod("subassign_Array_by_Nindex", "Array",
function(x, Nindex, value)
stop(wmsg(class(x)[[1L]], " objects don't support this ",
"form of subassignment at the moment"))
)
### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
### "[<-" method for Array objects
###
### Works on any array-like object that supports the 4 low-level generics
### above.
.subassign_Array <- function(x, i, j, ..., value)
{
if (missing(x))
stop(wmsg("'x' is missing"))
Nindex <- extract_Nindex_from_syscall(sys.call(), parent.frame())
nsubscript <- length(Nindex)
x_dim <- dim(x)
x_ndim <- length(x_dim)
if (nsubscript == 1L) {
i <- Nindex[[1L]]
if (type(i) == "logical" && identical(x_dim, dim(i)))
return(subassign_Array_by_logical_array(x, i, value))
if (is.matrix(i) && is.numeric(i))
return(subassign_Array_by_Mindex(x, i, value))
## Linear single bracket subassignment e.g. x[5:2] <- 4.
return(subassign_Array_by_Lindex(x, i, value))
}
if (nsubscript != x_ndim)
stop(wmsg("incorrect number of subscripts"))
Nindex <- normalize_Nindex(Nindex, x)
subassign_Array_by_Nindex(x, Nindex, value)
}
setReplaceMethod("[", "Array", .subassign_Array)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.