10

"["作成したカスタム クラスの添え字演算子 ( ) をオーバーロードしようとしています。下記の件について、どう対処したらよいか検討中です。

  • オペレーターが lhs または rhs のどちらを使用しているかをどのように判断できますか? すなわちa[x] = foofoo = a[x]
  • foo = a[,x]最初のパラメーターをどのように識別できますか?
  • a[seq(x,y)] を使用すると、シーケンス全体が展開されているようです。展開せずに最初、ステップ、最後の値を取得する簡単な方法はありますか?

編集:私の最初のポイントは複数の回答を受け取りました。その過程で、2番目の答えを見つけました。「missing」関数を使用して、どのパラメーターが存在するかを把握できます。

サンプルコードは次のとおりです。

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は私にとって最も優先度が低いため、この質問への回答を受け入れました。

4

4 に答える 4

10

ジェネリックを見つけて、実装しようとしているものを理解してください。

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) 
{
       ....

}
于 2014-03-14T14:53:25.310 に答える
7

最初の箇条書きについては、オーバーロードする関数が 2 つあります。

  1. [
  2. [<-

最初の関数は値を返し、2 番目の関数は値を設定します。のドキュメントを参照してください。Extract.data.frame{base}

于 2014-03-14T14:45:08.753 に答える
6

[.data.frame例としてのソースを参照してください。x、i、aj の順で表示されます。

> `[.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
于 2014-03-14T14:49:28.790 に答える
1

3 番目の箇条書きについては、次のようなものを使用できます。

seq_parse <- function(s) {
    the_s <- deparse(substitute(s))
    env <- new.env()
    assign("seq", function(...) return(list(...)), envir=env)
    seq_params <- try(eval(parse(text=the_s), envir=env), silent=TRUE)
    if(!inherits(seq_params, "try-error")) {
        cat("parsing successful \n")
        return(seq_params)
    } else {
        stop("Failed to parse.")
    }
}

この関数は、引数を に返しますseq

> seq_parse(seq(from=1,to=10,by=0.5))
working with params to seq_params 
$from
[1] 1

$to
[1] 10

$by
[1] 0.5 

または従来の評価された引数、

> seq_parse(1:5)
parsing successful 
[1] 1 2 3 4 5

ただし、それが良い習慣であるかどうかはわかりません。また、パラメーターを慎重に解釈する必要があります。seq名前が付けられていない可能性があり、代わりになどtoがある可能性があります。length.out

于 2014-03-14T16:12:19.367 に答える