5

このclass関数を使用すると、オブジェクトのクラスを判別できます。

> 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、それでも「double」タイプがあり、それでもすべてが機能します。タイプは、他のすべてのオブジェクトが継承するスーパークラスと考えることができますか?

4

2 に答える 2

3

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

代わりに、によって返される名前にほぼ対応する基本クラスtypeof(数値、文字、リスト、関数など)がありますが、常にではありません(たとえば、double型は数値クラス、specialおよびclosureは関数クラス、およびクラスdata.frameです。タイプリストです!)。

S3およびS4システムでは、基本クラスを使用して自明でないクラスを構築できます(ただし、これらの1つを拡張する必要はありません!!例:基本クラスsetClass("foo", list(a="numeric",b="character")を拡張しません)。

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

「偽物」としてキャストした後x、オブジェクトは正式には「数値」クラスではありません。

is(x, "numeric")
#FALSE

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

is.numeric(x)
#TRUE

そして、これがここで機能する理由+です。したがって、内部的には、@ Richieがすでに述べたように、デフォルトのメソッドxは数値の基本クラスとして解釈されます。

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


typeof(。)と基本クラス(。)の対応:

                              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"
于 2011-01-18T22:46:08.413 に答える
2

最初の質問に対する部分的な回答は、R 言語定義の第 2 章にあります。

R は、コンピューターのメモリへの直接アクセスを提供するのではなく、オブジェクトと呼ばれる特殊なデータ構造を多数提供します。これらのオブジェクトは、シンボルまたは変数を通じて参照されます。ただし、R では、シンボル自体がオブジェクトであり、他のオブジェクトと同じように操作できます。

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

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

2 番目の質問については、次のようになると思います。xクラスが "fake" であるため、R は+.fake追加でメソッドを探しますが、見つからない場合は、既定のメソッドに頼ります。そのデフォルトのメソッドは、基礎となる C コードtypeof(x)(または同等の C コード) を使用して何をすべきかを決定することに基づいています。この場合の型xは「整数」です。

于 2011-01-18T14:56:20.757 に答える