2016-01-26 13 views
5

私は現在、複数の方法で初期化できるRでR6 classをビルドする必要があるプロジェクトに取り組んでいます。私はそれについて最善の方法があると思っています。 $new()の機能を過負荷にすることは可能ですか?あるいは、ヘルパー関数を定義する必要がありますか?動機例としてR:R6クラスのコンストラクタを複数定義する方法は?

:私はベクトルvariable_namesまたは整数n_variablesのいずれかを使用して使用して初期化することができるフィールドnamesとR6クラスMyClassのための2つのコンストラクタを持ちたい(その場合には、名前のデフォルトのベクトルを初期化します) 。

機能は次のように動作するはずです:

#define the class (only has a constructor that accepts a vector of names) 
myClass <- R6Class("myClass", 
        public = list(
        names = NA, 
        initialize = function(names) { 
         if (!missing(names)) self$names <- names 
        }) 
) 

#create a test object using a vector of names 
variable_names = c("x","y") 
a = myClass$new(variable_names) 
a$names 
#> [1] "x y" 

#everything after here does not actually work (just to illustrate functionality) 
n_variables = 2; 
b = myClass$new(n_variables) 
b$names 
#> [1] "v1 v2" 

は私がIntroductory vignette,て見ていたが、これを行うための明確な方法があるようには思えません。

理想的には、引数に名前を付ける必要がない(つまり、私はmyClass$new(names=variable_names)のような何かをする必要がない)、入力が有効であることを簡単にチェックできる解決策を探しています。

+0

を与えますか? –

+0

@ 42-申し訳ありませんが、私はその提案に少し混乱しています。それはどのように機能しますか? –

+0

私はちょうどここで非常によく似た質問に答えましたhttps://stackoverflow.com/questions/35881234/ –

答えて

4

可能な方法は、任意の数の引数を関数に渡すことができるコンストラクタにドットドット(ellipsis)引数を使用することです。その後、 "..."をリストに変換し、入力引数を解析する必要があります。


たとえば、コンストラクタをarityでオーバーロードしたいとします。コンストラクタを呼び出す

myClass <- R6Class("myClass", 
    public = list(
     name = NA, 
     age = NA, 
     favouriteFood = NA, 
     # Constructor overloaded by arity 
     initialize = function(...) { 
     arguments <- list(...) 
     switch(nargs(), 
      # one input argument 
      {self$name <- arguments[[1]]}, 
      # two input arguments 
      {self$name <- arguments[[1]] 
      self$age <- arguments[[2]]}, 
      # three input arguments 
      {self$name <- arguments[[1]] 
      self$age <- arguments[[2]] 
      self$favouriteFood <- arguments[[3]]} 
     ) 
     print(self) 
     }) 
) 

は今、あなたは、コンストラクタに名前の所望の数を渡しますラッパーヘルパー関数を構築することができ、私たちに

> a = myClass$new("john") 
<myClass> 
    Public: 
    age: NA 
    clone: function (deep = FALSE) 
    favouriteFood: NA 
    initialize: function (...) 
    name: john 
> a = myClass$new("john",35) 
<myClass> 
    Public: 
    age: 35 
    clone: function (deep = FALSE) 
    favouriteFood: NA 
    initialize: function (...) 
    name: john 
> a = myClass$new("john",35,"pasta") 
<myClass> 
    Public: 
    age: 35 
    clone: function (deep = FALSE) 
    favouriteFood: pasta 
    initialize: function (...) 
    name: john 
関連する問題