2011-02-10 3 views
13

に失敗S3の印刷方式のためのオブジェクト名はS3クラスのオブジェクト "バー" と印刷方法を定義行き方:

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

を今すぐプリント(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の関数をサブクラス化できます。

答えて

8

これは、かなり特殊なケースですコマンドラインで名前を入力するときは、その値で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) 

エルゴ、あなたはどこからでもオブジェクトの名前を抽出します地球上に方法はありません。それは単純にコールスタックにはありません。

+0

これはできないようです。私はソースがどのように起こるかを正確に見るためにソースを見ているかもしれません。どうも! – Spacedman

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 

あなたは同じオブジェクトに別の名前を使用しない限り:Rはfooを代用として

> fooX <- foo 
> fooX 
print.bar says this was foo