2015-11-21 27 views
10

私はここ$と例ですR.

に(記号で)オペレータ$(ドル記号)と@?Syntaxを介して)「コンポーネント/スロット抽出」との差はあるのだろうか。

yo=data.frame(c(1:10), c(rnorm(10,0,1))) 
yo$c.1.10. 

プリント:

[1] 1 2 3 4 5 6 7 8 9 10 

[email protected] 
Error: trying to get slot "c.1.10." from an object (class "data.frame") that is not an S4 object 

ここ@との例を示します

setClass("track", representation(x="numeric", y="numeric")) 
myTrack <- new("track", x = -4:4, y = exp(-4:4)) 
[email protected] 

プリント:いずれの場合も

[1] -4 -3 -2 -1 0 1 2 3 4 

myTrack$x 
Error in myTrack$x : $ operator not defined for this S4 class 

、なぜ1つの作業や他のではないのですか?

もう一つの例は、RでSoDAパッケージから以下である、機能geoXYに:

library(SoDA) 
xy <- geoXY([email protected], [email protected], unit = 1000) 
plot(xy[,1], xy[,2], asp = 1) 
+2

@は、特にS4オブジェクト用です。 – joran

答えて

12

私は(this質問を経由して)これについてR Language defenitionには何も表示されない、

しかし、違いは基本的に:@はS4オブジェクト、$はリスト(多くのS3オブジェクトを含む)用です。あなたが指定されたオブジェクトのために使用するかについて迷っている場合は、ちょうどstrを見て、ビット抽象的かもしれ

、例えば:

str(yo) 
# 'data.frame': 10 obs. of 2 variables: 
# $ c.1.10.   : int 1 2 3 4 5 6 7 8 9 10 
# $ c.rnorm.10..0..1..: num -0.536 -0.453 -0.599 1.134 -2.259 ... 

私たちはここ$を見ることができるので、$は何ですか使用する。また

ここ
str(myTrack) 
# Formal class 'track' [package ".GlobalEnv"] with 2 slots 
# [email protected] x: int [1:9] -4 -3 -2 -1 0 1 2 3 4 
# [email protected] y: num [1:9] 0.0183 0.0498 0.1353 0.3679 1 ... 

、我々は@を参照してください、そう@は使用すべきです。

このことはできS4オブジェクトは(私のために最初に頭に浮かぶdataスロットの列が[email protected]$columnを介してアクセスすることができSpatialPolygonsDataFrame、何であるか)

そのスロットのいずれかでリストを持っている場合であっても、より多くの混乱を取得

@に関連してもう少し詳細を示す?slotも参照してください。の代わりにの代わりに@がオブジェクトと一緒に動作することが期待できるかどうか、または一般的にはChapter of Hadley Wickham's book on S4 objectsを参照してください。

+0

...うまく設計されたS4クラスはおそらく、クラスに含まれるデータにアクセスするメソッドを持つべきであり、ユーザーはスロット名に頼る必要はありませんが、これは議論の余地があります... – Spacedman

関連する問題