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"