3

デフォルトの出力要素を定義し、残りの要素を非表示にするオプションがあるかどうか、R の S3 クラスについて疑問に思いました。例として、次のように、特定のものを計算して S3 クラスとして報告するおもちゃの関数があるとします。

toy <- function(x){
  resA <- mean(x)
  resB <- length(x)

  output <- list(resA=resA, resB=resB, x=x)
  class(output) <- "toy"
  output
}

今すぐ結果にアクセスすると

res <- toy(c(1:10))
res

予想どおり、リスト全体を出力として取得します。しかし、S3 印刷メソッドも定義すると

`print.toy` <- function(x){
  print(x$resA)
}

resB不要な情報 (この場合はとx) を隠し、ユーザーには のみが表示される print の標準出力を提供できますresAtoyただし、 classのオブジェクトにさらに計算を適用する場合、これは混乱を招く可能性があります。

res <- toy(c(1:10))
res 
# Produces an error
res + 1 
# Accesses the correct variable of class toy:
res$resA + 1

私の質問は、呼び出しが同様に機能するresAように、変数が指定されていない場合に取られるべき S3 クラスの標準値になるようにリスト項目を定義する方法はありますか?res + 1

これを読んでくれてありがとう。

4

2 に答える 2

4

1 つのアプローチは、リストの代わりにベクター + 属性を使用することです。これは、通常のベクターのように機能する 1 つの主要なデータと、いくつかの追加のメタデータがある場合に最適です。

toy <- function(x) {
  resA <- mean(x)
  resB <- length(x)

  structure(resA, x = x, b = resB, class = "toy")
}
print.toy <- function(x, ...) {
  print(as.vector(x))
}
t <- toy(1:10)
t + 1
# [1] 6.5

[デフォルトのメソッドでは属性が保持されないため、オーバーライドする必要もあります。

于 2013-03-06T14:32:53.187 に答える
2

@Ari が言及しているように、次のようなことをしなければならない場合があります。

`+.toy` <- function(a, b) { 
     # you should check for class/mode/is.atomic here if necessary
     a$resA <- a$resA + b
     a
}

t <- toy(1:10)
t + 1
# [1] 6.5
于 2013-03-06T07:22:59.317 に答える