2016-03-21 36 views
0

Başka bir referans sınıfında nesne olarak kullanacağım bir referans sınıfım var. Örnek: Ben comment işaretleri sonra ilk satırı çağırmakR: Referans Sınıfı Referans Sınıfı Alanlar Referans Sınıfı

class_1 <- setRefClass(Class = "class_1" 
    , fields = list(nickname = "character", version = "character") 
    , methods = list(
     initializer = function(nickname, version) { 
     nickname <<- nickname 
     version <<- version 
     } 
    ) 
) 

class_2 <- setRefClass(Class = "class_2" 
    , fields = c(version = "character" 
        , nickname = "character" 
        , class_1_item = "class_1") 
    , methods = list(
     initializer = function(class_2_nickname = "B", class_2_version = "V2") { 
     class_1_item <<- class_1$new(class_2_nickname, class_1_version) 
     nickname <<- class_2_nickname 
     version <<- class_2_version 
     } 
    ) 

) 

####### 

class_2_obj <- class_2$new(nickname = "A", version = "V1") 

class_1_obj <- class_1$new(nickname = "A", version = "V1") 

class_2_obj2 <- class_2$new() 

, bunun içinde bir class_1 nesne ile class_2 nesnesi oluşturur, ancak parçası olarak adlandırılan yapıcısını sahip nesne class_1_item alanları başlatır asla ilk satırın Ancak, kurucuyu doğrudan satır 2'de (sınıf 2 yapıcısının dışında) aradığımda, bu alanları çok iyi başlatır. Son olarak, 3 satırındaki kurucuyu argüman olmadan çağırdığımda, varsayılan argümanları bile almaz ve her şeyi boş bırakır.

R sınıfları hakkında temel bir şey olduğunu hissediyorum, bu onları almadığım C/Python/Java sınıflarından tamamen farklı kılıyor. Atama işlecini $ setRefClass() $ ile kullandığımda "class_1" nesnesinin bir nesne olarak başvurduğunu anlamıyorum. Ayrıca, "< < -" operatörünün bu bağlamda "< -" operatörüne göre kullanılması için hangi durumlarda kullanıldığını anlamıyorum.

Neyi eksik?

cevap

1

S4 referans sınıfları için başlatma işlemi her zaman beni şaşırttı, bu yüzden daha iyi bir çözüm olabilir.yerine <<- kullanmak zorundasınız çünkü normal atama operatörü yalnızca yerel bir atama yapar - init yönteminize yerel. Ancak, nesneniz için tanımlanan herhangi bir yöntemin çevreleyen ortamında bulunan nesneleri değiştirmek istiyorsunuz. Çevre ortamında bir ödev yapmak için <<-'a ihtiyacınız vardır. Bir alternatif, aşağıda gösterim için kullandığım .self'un kullanımıdır - bildiğim kadarıyla tercih dışında bir fark yoktur.

Ayrıca, örneklerinizi, init sürecinin beklentinizle uyumlu olacak şekilde değiştirdim. setRefClass işlevinin başlatma bölümü okumaya değer olabilir. Tanımladığınız gibi, initializer yönteminin, initialize yönteminin aksine ne anlama geldiğini anlayamadım, ancak bunun gerçekten istediğinizi yaptığına inanıyorum. Ayrıca, atıfta bulunduğunuz ama hiçbir yerde tanımlanmayan class_1_version nesnesinden hiçbir şey anlamamıştım. Ama umarım aşağıdakiler işe yarar.

class_1 <- setRefClass( 
    Class = "class_1", 
    fields = list(nickname = "character", version = "character"), 
    methods = list(
     initialize=function(nickname = NA_character_, version = NA_character_) { 
      .self$nickname <- nickname 
      .self$version <- version 
     } 
    ) 
) 

class_2 <- setRefClass(
    Class = "class_2", 
    fields = c(
     version = "character", 
     nickname = "character", 
     class_1_item = "class_1" 
    ), 
    methods = list(
     initialize=function(nickname = NA_character_, version = NA_character_) { 
      .self$class_1_item <- class_1$new(nickname, version) 
      .self$nickname <- nickname 
      .self$version <- version 
     } 
    ) 
) 
+0

Teşekkürler! Bu bir yazım hatası olmalı, o zaman - $ intializer $ $ $ initialize $ olmalıdır. – ecksc