2011-01-18 3 views
4

は、オブジェクトのクラスを決定することができます。is.objectとS3クラスシステム

> x = 5 
> class(x) 
[1] "numeric" 

私はまた、オブジェクトがクラスを持っている場合、我々が判断するためにis.objectコマンドを使用することができることを理解します。しかし、いくつかのオブジェクト型は暗黙的で、それは

> is.object(x) 
[1] FALSE 

R内のすべての変数がオブジェクトであり、is.objectは唯一の非暗黙のクラスのためのテストであることを述べるために正しいだろうですか?

また、どのようにこれに適合しますか。単純に、私は次のコードは、エラーを生成することを考えた:

> x = 5 
> class(x) = "fake" 
> x = X + 1 
> x + 1 
[1] 6 
attr(,"class") 
[1] "fake" 

しかしxは、まだ、まだすべてがまだ動作し、「ダブル」と入力しています。型は他のすべてのオブジェクトが継承するスーパークラスと考えることができますか?

+0

、S3タグが存在しません。誰かがs3タグを作成しますか? – csgillespie

+2

私は、タグ付けが十分であると思っていました.--( – cadrian

+1

s3はamazon-s3と明らかに同義です。質問/ 75332/tag-synonym-collission-a-valid-tagは無関係なタグと同義語として使用されています –

答えて

2

typeofは内部C表現の型を返し、メソッドディスパッチには使用されません。厳密に言えば、タイプを「スーパークラス」と考えることはできません。

ではなく基本クラスおおよそtypeofによって返された名前 に対応し、常にではない(例えばである特別な、数値の二重されたクラスの型と閉鎖(数値、文字、リスト、機能など)がありますクラス 関数であり、クラスdata.frameはリスト型です!)。あなたが(:setClass("foo", list(a="numeric",b="character")基本クラスのいずれかを拡張しません!!例これらのいずれかを拡張ではなく、必要に応じて)基本的なクラスを使用して、非自明なクラスを構築することができS3およびS4システムでは

これらの基本クラスのオブジェクトの場合is.objectFALSEを返します。ドキュメントによれば、この関数は、オブジェクトがユーザービルドS3またはS4クラス(つまり、基本クラスではない)であるかどうかを確認する非常に速い方法を に提供します。

is(x, "numeric") 
#FALSE 

が、それは基本的な「数値」オブジェクトとして解釈です::

is.numeric(x) 
#TRUE 

そして、これは「偽物」あなたのオブジェクトは、「数値」クラスの正式ではないようxをキャストした後

なぜ+がここにあるのですか?だから、内部的に@Richieはデフォルトメソッドがを 数値基本クラスとして解釈しているとすでに言っています。

この概念上の混乱は、S3のクラスの非公式な扱いによるものです。代わりにS4を使用してください。


typeof演算の対応関係と基本クラス(。)(。):S4タグがあるが

       typeof(.) class(.) 
NULL       "NULL"  "NULL" 
1        "double" "numeric" 
1:1       "integer" "integer" 
1i       "complex" "complex" 
list(1)      "list"  "list" 
data.frame(x=1)    "list"  "data.frame" 
pairlist(pi)     "pairlist" "pairlist" 
c        "special" "function" 
lm       "closure" "function" 
formals(lm)[[1]]    "symbol" "name" 
formals(lm)[[2]]    "symbol" "name" 
y~x       "language" "formula" 
expression((1))[[1]]   "language" "(" 
(y~x)[[1]]     "symbol" "name" 
expression(x <- pi)[[1]][[1]] "symbol" "name" 
+0

S4はそれ自身の問題を紹介しています。私はS3の代わりにS4を使うことをアドバイスするのは良いとは思いません。 – hadley

+0

@hadley私の経験では、これは多くの場合予期せぬ結果を招き、個人的には非常に疲れています。システム自体は、モスの一つとして広く認識されているCommon Lisp Object Systemを模倣しています柔軟で丈夫なオブジェクトの向き。さらに、RがますますS4-rishになるという事実は、S3ではなくS4を使用する良い理由です。 – VitoshKa

2

最初の質問への部分的な答えはR言語defninitionの第2章で発見された

R does not provide direct access to the computer’s memory but rather provides a number of specialized data structures we will refer to as objects. These objects are referred to through symbols or variables. In R, however, the symbols are themselves objects and can be manipulated in the same way as any other object.

ので、はい、すべての変数はオブジェクトです。

is.objectは、多かれ少なかれfunction(x) !is.null(attr(x, "class"))と同等ですが、私は間違っていることが証明されています。

は、2番目の質問については、私はこれは何が起こるかだと思う:x以来 が「偽」クラスを持ち、Rは、ほかに方法+.fakeを探しますが、それが見つからないときは、デフォルトの方法に頼っ。このデフォルトの方法は、何が行われるべきかを決定するためにtypeof(x)(または同等のC)を使用する基になるCコードに基づいています。この場合、xのタイプは「整数」です。

+0

これはちょっと複雑ですが、キーは内部ジェネリックを検索することです。私の電話にいないときはもっと書くでしょう – hadley