2017-08-24 9 views
1

私はスカラーにとって非常に新しいです。スカラ:動的に関数を呼び出す

私はrscalaを使ってR関数と統合しています。 たとえば、次のメソッドを使用してR関数を呼び出し、文字列値を取得しています。

メソッドシグネチャ:

デフinvokeS0(機能:リファレンス、引数:任意*):文字列

メソッドの実装

val v= rc.invokeS0("doPred","lemmas"->"Communicate,Design,Java,","frequency"->"3,3,1") 

私の問題

しかし、rc.invokeS0はANY関数を呼び出すことができ、したがって任意の数の引数を持つことができます。

私は、関数名をStringとして、引数をMapとしてとるラッパーメソッドを構築することを考えています。おそらく次のようなものです:

private def invokeRStringFunction(functionName: String = "testFunction", args: Map[String,String]): Unit = 
{ 
    /**Iterate through map to generate following code*/ 
    val v= rc.invokeS0(functionName,mapKey1->mapValue1,mapKey2->mapValue2 etc etc) 
} 

しかし、引数の数が動的であるため、コードを書く方法はわかりません。率直に言って、私はそれが可能かどうかはわかりませんが、ちょうど私がチェックすると思っていました。

ご意見をいただければ幸いです。

答えて

2

Map[String, String]をにargs.toSeqに変換してから、_* ascriptionを使用して1つではなく一連の引数として渡します。

def invokeRStringFunction(functionName: String, args: Map[String, String]): Unit 
= rc.invokeS0(functionName, args.toSeq: _*) 
+0

ありがとうございます!どのように ' - >'演算子をパラメータ名とパラメータ値の間で扱うのでしょうか? – Jake

+1

オペレータではありません。 Scalaにはほとんど演算子がありません。 ' - >'は単に 'Any'の暗黙の変換によって定義されたメソッドで、2つの値のうちの1つを生成します。 'a - > b'は'(a、b) 'と同じことを意味しますが、よりよく見えます。 'Map [A​​、B]'は 'Seq'に変換されると、キーと値のペア'(A、B) 'になります。 – HTNW

+0

私はそれを試してみましょう!感謝万円。私はupvoteと作業時に受け入れることを確認します – Jake

関連する問題