13

S3 クラス "bar" のオブジェクトと print メソッドを定義します。

foo=list(1)
class(foo) <- c("bar")
print.bar <- function(x,...){
  cat("print.bar says this was ",deparse(substitute(x)),"\n")
}

今 print(foo) はこれを行います:

> print(foo)
print.bar says this was  foo 

素晴らしいですが、自動印刷は失敗します:

> foo
print.bar says this was  structure(list(1), class = "bar")

これは、行がトップレベルの式として評価される方法と関係があると思います。R-develをすばやく検索しても無駄でした。誰でもそれを修正する方法を知っていますか?

名前が必要な理由は、定義しているものが関数であり、印刷メソッドに「try foo(2)」を配置できるようにしたいからです (オブジェクトの名前から「foo」を取得します)。はい、S3 で関数をサブクラス化できます。他にもピフォールがいるかもしれないと思います..

4

2 に答える 2

8

コマンド ラインで名前を入力すると、Rfooは呼び出しの前にその値で置換されるため、これはかなり特殊なケースです。printこれは次のように説明できます。

foo=list(1)
class(foo) <- c("bar")
print.bar <- function(x,...){
  print(sys.calls())
}

> foo
[[1]]
print(list(1))

[[2]]
print.bar(list(1))

> print(foo)
[[1]]
print(foo)

[[2]]
print.bar(foo)

エルゴ、属性としての名前がなければ(アーロンが示したように)、どこからでもオブジェクトの名前を抽出する方法は地球上にありません。コールスタックにはありません。

于 2011-02-10T21:39:20.493 に答える
5

オブジェクトの名前を変更しない場合は、名前を属性として含めて、代わりに出力できます。

foo <- structure(list(1), class="bar", name="foo")
print.bar <- function(x,...){
  cat("print.bar says this was",attr(x, "name"),"\n")
}

次に、期待どおりに動作します。

> print(foo)
print.bar says this was foo 
> foo
print.bar says this was foo 

同じオブジェクトに別の名前を使用しない限り:

> fooX <- foo
> fooX
print.bar says this was foo 
于 2011-02-10T19:06:19.957 に答える