1

我正在尝试附加“矩阵”类,然后覆盖“[”的默认行为。下面的代码示例:

annMatrix <- function(mat=NULL, rowAnn=NULL, colAnn=NULL) {
  if(is.null(mat)) mat <- matrix(nrow=0, ncol=0)
  mat <- as.matrix(mat)
  if(is.null(rowAnn)) rowAnn <- data.frame(row.names=seq_len(nrow(mat)))
  if(is.null(colAnn)) colAnn <- data.frame(row.names=seq_len(ncol(mat)))
  rowAnn <- data.frame(rowAnn, stringsAsFactors=FALSE)
  colAnn <- data.frame(colAnn, stringsAsFactors=FALSE)
  stopifnot(nrow(mat)==nrow(rowAnn) & ncol(mat)==nrow(colAnn))
  attr(mat, "colAnn") <- colAnn
  attr(mat, "rowAnn") <- rowAnn
  class(mat) <- append(class(mat), "annMatrix")
  mat
}

`[.annMatrix` <- function(annMat, rowExpr=NULL, colExpr=NULL) {
  stopifnot(is.valid.annMatrix(annMat))
  rowExpr <- eval(substitute(list(rowExpr)), attr(annMat, "rowAnn"), parent.frame())
  colExpr <- eval(substitute(list(colExpr)), attr(annMat, "colAnn"), parent.frame())
  indsR   <- unlist(rowExpr)
  indsC   <- unlist(colExpr)
  if(is.null(indsR)) indsR <- seq_len(nrow(annMat))
  if(is.null(indsC)) indsC <- seq_len(ncol(annMat))
  attr(annMat, "rowAnn") <- attr(annMat, "rowAnn")[indsR,,drop=FALSE]
  attr(annMat, "colAnn") <- attr(annMat, "colAnn")[indsC,,drop=FALSE]
  annMat <- unclass(annMat)
  annMat <- annMat[indsR,indsC,drop=FALSE]
  class(annMat) <- append(class(annMat), "annMatrix")
  annMat
}

基本思想是使矩阵在子集后保留其特定属性。

但是我遇到了一个问题:

如何编写“[”函数,使其在使用和不使用逗号时表现不同:

annMat[i]
annMat[i,]

作为矩阵的默认“[”似乎可以做到。

我正在考虑将第二个参数默认设置为某个值,但是由于添加了逗号,该值不会改变。

4

0 回答 0