10

クラスを定義するとき、Rにはプライベートスロットとパブリックスロットの概念がありますか?

言語にこれに対する厳密な機能がない場合、一般的な命名スキームはありますか?

4

1 に答える 1

14

編集 :

少し歴史を説明すると、 setClass 関数では、クラスで提供されるゲッターとセッターを介してのみアクセスできる、いわゆる「特権スロット」を作成するオプション「アクセス」が提供されました。これにより (getter を提供しないことで) プライベート スロットを作成できますが、この機能は実装されていません。現在のヘルプページは次の?setClassとおりです。

S-Plus との互換性のために含まれていますが、現在は無視されています。


@したがって、すべてのスロットが到達可能であるため、プライベート スロットとパブリック スロットのようなものはありません。個人的には、パッケージに含まれているゲッターとセッターを使用して簡単に到達できないオブジェクトからの情報を使用できるようになるので、非常に満足しています。また、ゲッターとセッターによって作成されるオーバーヘッドを回避することで、重い計算を節約することもできます。

パブリック スロットと「プライベート」スロットを区別するための命名規則については知りません。「プライベート」スロットの前にドットを付けることで区別できますが、スロットの動作には影響しません。ほとんどの R プログラマーはパブリック スロットとプライベート スロットを気にしないため、これも一般的な方法ではありません。彼らは、平均的なユーザーが到達すべきではないスロットのゲッターとセッターを提供していません。

簡単な例を挙げると、次の例では、2 つのスロットを持つクラスと、1 つのスロットのみのゲッターとセッターを作成します。

setClass("Example",
  representation(
    aslot = "numeric",
    .ahiddenslot = "character"
  )
)

setGeneric("aslot", function(x) standardGeneric("aslot"))

setMethod("aslot","Example",function(x){
    x@aslot
})

setGeneric("aslot<-", function(x,value) standardGeneric("aslot<-"))

setMethod("aslot<-","Example",function(x,value){
    x@aslot <- value
    x
})

show非表示のスロットを出力しないメソッドを設定することもできます:

setMethod("show","Example",function(object){
  cat("Example with value for aslot: ", object@aslot,"\n")
})

これにより、次の通常の使用が可能になります。

> X <- new("Example",aslot=1,.ahiddenslot="b")
> X
Example with value for aslot:  1 
> aslot(X)
[1] 1
> aslot(X) <- 3

しかし、.ahiddenslot にはまだ到達可能です。

> slot(X,".ahiddenslot")
[1] "b"
于 2012-05-25T14:08:24.133 に答える