2016-07-08 8 views
2

は、私はS4クラスに他のスロットから派生したS4スロットの試作(開始)方法は?

setClass("Person", representation(name = "character", first_letter = "character") 

を持っていると私は、オブジェクトが開始されたときにスロットfirst_letterを自動入力するとします。

> jack <- new("Person", name = "Jack") 
> print(jack) 
# Slot "name": 
# "Jack" 
# 
# Slot "first_letter": 
# "J" 

ような何か私はこのような何かやるべきだと思う。もちろん

setClass("Person", 
    representation(name = "character", first_letter = "character"), 
    prototype(first_letter = substring([email protected], 1, 1)) 
) 

を、私は別の声明でこれを行う方法を記述することができます。私は特にfirst_letterスロットがnewを呼び出して別のスロットからの情報で開始される場合に興味があります。

ご協力いただきありがとうございます。

答えて

2

を望むように、1つの方法を初期化することができるはず... return

それを覚えておく必要がプライベートフィールドとしてfirst_letterを確認することです。

  1. は、あなたが他のフィールドのを変更したときに同じロジックを維持するために公共のスロットのために取得/設定定義する他のパブリックフィールドを使用してプライベートフィールドを設定するカスタムコンストラクタ(initiate)を作成します。ここ

一の実装:今

## Note the use of `.` for private field 
## this is just a convention 
Person <- setClass("Person", representation(Name = "character", 
              first_letter. = "character")) 

## define setter and getter for public slots 
setGeneric("Name", function(x) standardGeneric("Name")) 
setMethod("Name","Person",function(x) [email protected]) 
setGeneric("Name<-", function(x,value) standardGeneric("Name<-")) 
setMethod("Name<-","Person",function(x,value){ 
    [email protected] <- value 
    [email protected]_letter. <- substring(value, 1, 1) 
    x 
}) 
## define the constructor 
## Note that we don't give an argument to the ctor 
## to init the private field 
setMethod ("initialize", signature = "Person", 
      definition = function (.Object, 
            name) { 
      [email protected] <- name 
      [email protected]_letter. <- substring(name, 1, 1) 
      return (.Object) 
      }) 

、オブジェクトを作成することによって、これをテスト:、うわこれを

> Name(p) <- "Xvalue" 
> p 
An object of class "Person" 
Slot "Name": 
[1] "Xvalue" 
## Again the private slot is updated 
Slot "first_letter.": 
[1] "X" 
+0

> p <- Person(name="Amine") > p An object of class "Person" Slot "Name": [1] "Amine" ## the slot is automatically initialized Slot "first_letter.": [1] "A" 

はその後、我々は、スロットの値を変更していますすごいです!ほんとうにありがとう! :D – nev

1

prototypeパラメータを使用すると、オブジェクトスロットにデフォルト値を割り当てることができます。 しかし、オブジェクトのスロットにデータを割り当てる前に何らかの事前処理を行う場合は、 初期化メソッドをクラスに定義する必要があります。同じように動作しますrepresentation

また、あなたがslotパラメータを使用することをお勧めします... 、 私はわからない継承はあなたが意図し何であるS3のために意図された(?setClassをご確認ください)

その後、あなたの定義クラス

setClass ("Person", slots = c (name = "character", first_letter = "character")) 

または

setClass("Person", representation (name = "character", first_letter = "character")) 

とイニシアlization方法:

setMethod ("initialize", signature = "Person", 
      definition = function (.Object, 
            name, 
            first_letter = substring (name, 1, 1)) { 
       [email protected] <- name 
       [email protected]_letter <- first_letter 
       return (.Object) 
      }) 

.Objectは、この(ジェネリック方法で定義された同じ名前)のように呼び出す必要があります。 はまた、通常、あなたは今、あなたはあなたが

new("Person", name = "Jack") 
関連する問題