質問
を使用して 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
まだ「ダブル」タイプがありますが、それでもすべてが機能します。タイプは、他のすべてのオブジェクトが継承するスーパークラスと考えることができますか?
解決
typeof
内部C表現のタイプを返しますが、メソッドディスパッチには使用されません。厳密に言えば、タイプを「スーパークラス」と考えることはできません。
代わりにあります 基本クラス (数字、文字、リスト、関数など)は、によって返された名前にほぼ対応する typeof
, 、しかし、常にではありません(たとえば、タイプダブルはクラスの数値であり、特別な閉鎖はクラス機能であり、クラスデータはタイプリストです!)。
S3およびS4システムを使用すると、基本的なクラスを使用して非些細なクラスを構築できます(ただし、それらのいずれかを拡張する必要はありません!!例: setClass("foo", list(a="numeric",b="character")
どれも拡張しません 基本クラス).
これらの基本クラスのオブジェクト用 is.object
戻り値 FALSE
. 。そのドキュメントが言うように、この関数は、オブジェクトがユーザービルドS3またはS4クラスのものであるかどうかを確認するための非常に高速な方法を提供します(つまり、基本クラスのいずれでもありません)。
キャスト後 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"
他のヒント
最初の質問に対する部分的な答えは、R言語defninitionの第2章にあります
Rは、コンピューターのメモリへの直接アクセスを提供するのではなく、オブジェクトと呼ばれる多くの特殊なデータ構造を提供します。これらのオブジェクトは、シンボルまたは変数を介して参照されます。ただし、Rでは、シンボルはそれ自体オブジェクトであり、他のオブジェクトと同じ方法で操作できます。
したがって、はい、すべての変数はオブジェクトです。
is.object
多かれ少なかれ同等のようです function(x) !is.null(attr(x, "class"))
しかし、私はそれについて間違っていることが証明されることをいとわない。
2番目の質問に関しては、これが何が起こるかだと思います:から x
クラス「偽物」があり、Rはメソッドを探します +.fake
追加では、それが見つからない場合は、デフォルトの方法に頼ります。そのデフォルトの方法は、基礎となるCコードに基づいています。 typeof(x)
(またはc同等)何をすべきかを決定します。この場合、タイプ x
「整数」です。