2017-07-26 6 views
1

私はC++のバックグラウンドから来て、R6パッケージを使ったROPプログラミングのために使っています。
大きなOOPコードを記述するときは、次の典型的な状況を考慮してください。 - あなたはまた、非常に複雑であってよく、コードの行数とそれぞれのあなたは、いくつかの(おそらく多くの)機能を持っているクラス、持っている:当然R6関数の値を変更することはできますか? (良いスタイルのOOPプログラミングですか?)

# file CTest.R 

cTest <- R6Class(
    "CTest", 
    public = list(
    z = 10, 
    fDo1 = function() { 
     # very long and complex code goes here 
     self$z <- self$z*2; self$z 
     }, 
    fDo2 = function() { 
     # another very long and complex code goes here 
    print(self) 
    } 
) 
) #"CTest" 

、あなたはALL入れたくないし同じ(CTest.R)ファイル内にあなたの長くて様々な機能があります。それは面倒で扱いにくいものになります。
C++でプログラムする場合、そのようなコードをプログラムする通常の方法は次のとおりです。まず、.hファイルで関数を宣言してから、関数を定義する複合関​​数ごとにファイル.cを作成します。これにより、効率的なソース管理を含む共同作業によるコード作成が可能になります。

私は、上記のコードのように関数を宣言してから、実際に長くて複雑なコードを後で割り当てるように、Rで同様のことを試みました。別のファイルCTest-Do1.R)に置く:それが動作するかどうか

cTest$f <- function() {  
    self$z <- self$z*100000; self$z 
} 

は、今、私がテスト:

> tt <- cTest$new(); tt; tt$fDo1(); tt 
<CTest> 
Public: 
clone: function (deep = FALSE) 
fDo1: function() 
fDo2: function() 
z: 10 
[1] 20 
<CTest> 
Public: 
clone: function (deep = FALSE) 
fDo1: function() 
fDo2: function() 
z: 20 

いいえ、それは上記の出力からわかるようにnot.-し、機能が変更されていません。

アドバイスはありますか?

+1

https://stackoverflow.com/questions/26331030/dynamically-add-function-to-r6-class-instance –

+1

"C++(Javaなど)でプログラムする場合、そのようなコードをプログラミングする通常の方法は次のとおりです。 .hファイルで関数を宣言した後、関数を定義する複素関数ごとに.cファイルを作成します。これはJavaでは実際には適用されません。実際には、言語が個別のヘッダーファイルと実装ファイルを持つことは一般的ではありません。 – user2357112

答えて

1

上記のGrothendieckのコメントのおかげで、それを動作させるための妥当な回避策があります。

の代わりにこのこの

# CTest-Do1_doesnotwork.R 
cTest$fDo1 <- function() { 
    ... 
}  

ライト:

# CTest-Do1_works.R 
cTest$set(
    overwrite = TRUE, "public", "fDo1",  
    function() { 
     ... 
    } 
) 

このコードは本来所望のように、別のファイルに書き込むことができます。

私はまだ疑問に思っています。上記は、Rコミュニティで大きなOOPコードを書くための実際の(実際の)ベストプラクティスですか? (私に少し奇妙に見える)。
そうでない場合、それは何ですか(単にsource()を使用する以外に)? - クラスの別々の部分(関数)の協調的なコーディングとソース管理を可能にするために?

1

ここでもR6ベストプラクティスを検索しました。どこか別の

cTestfDo1 <- function(self) { 
    self$z <- self$z*2; self$z 
} 

とを持っている他の

cTest<- R6::R6Class("CTest", 
    public = list(

    fDo1 = function() 
    cTestfDo1(self), 

    fDo2 = function(x) 
    cTestfDo2(self, private, x) 
)) 

とを必要に応じて、私が見てきた一つの方法(here)は、通常のRの関数として他の場所で関数を定義して、自己の民間などを渡すことです

cTestfDo2 <- function(self, private, x) { 
    self$z * private$q + x 
} 

など

それは最高のPRだ場合、私は知りませんactice、または効率的ですが、クラス定義はそれできちんとしていて、cTestfDo1関数がエクスポートされていないと、ネームスペースでも比較的素敵です。

+0

Gabor https://github.com/r-lib/processx/blob/master/R/process.Rの別の例 – dougmet

関連する問題