提问者:小点点

重载下标操作符"["


我正在尝试为我创建的自定义类重载下标操作符("[")。我正在尝试弄清楚如何处理以下问题。

  • 如何确定运算符是在lhs上还是rhs上?即a[x]=foovsfoo=a[x]
  • foo=a[, x]这样订阅整个维度时,如何识别第一个参数?
  • 当使用[seq(x, y)]时,它似乎正在扩展整个序列。有没有一种简单的方法可以在不扩展的情况下获取第一个、步骤和最后一个值?

编辑:我的第一点已经收到了多个答案。在这个过程中,我已经找到了第二个问题的答案。您可以使用“缺失”函数来确定存在哪些参数。

这是一个示例代码:

setMethod("[", signature(x="myClass"),
          function(x, i, j, k, l) {
              if (missing(i)) { i = 0 }
              if (missing(j)) { j = 0 }
              if (missing(k)) { k = 0 }
              if (missing(l)) { l = 0 }
          })

我已经接受了这个问题的答案,因为第三点对我来说是最不优先的。


共3个答案

匿名用户

发现泛型,这样你就知道你的目标是什么:

getGeneric('[')
# standardGeneric for "[" defined from package "base"
# function (x, i, j, ..., drop = TRUE) 

和:

getGeneric('[<-')
# standardGeneric for "[<-" defined from package "base"
# function (x, i, j, ..., value) 

然后你像这样实现它,例如:

`[<-.foo` <-
function(x, i, j, value) 
{
       ....

}

匿名用户

对于第一个要点,有两个函数要重载:

  1. [
  2. [

第一个函数返回值,第二个函数设置值。请参阅的留档Extract.data. frame{base}

匿名用户

[. data.frame的源代码为例。您有一个x、一个i和一个j,按顺序排列。

> `[.data.frame`
function (x, i, j, ..... )
> `[<-.data.frame`
function (x, i, j, value) 

你可以做类似的事情:

obj <- structure(runif(10),class="myclass")
`[.myclass` <- function(x,i=NULL,j=NULL) {
  message("First parameter is ", i, "\n")
  message("Second parameter is ", j, "\n")
    sum(x)
}
obj[c(1,2,3)]

`[<-.myclass` <- function(x,i=NULL,j=NULL,value) {
    res <- unclass(x)
    res[i] <- value
    res
}
obj[1] <- 1

顺序无关紧要。i和j将是正确的:

2 -> obj[2]
> obj
 [1] 1.0000000 2.0000000 0.3466835 0.3337749 0.4763512 0.8921983 0.8643395 0.3899895 0.7773207 0.9606180