2017-08-24 120 views
1

我對scala非常陌生。Scala:動態調用函數

我正在使用rscala與R函數集成。 例如,我正在使用以下方法調用R函數並檢索字符串值。

方法簽名:

高清invokeS0(功能:參考ARGS:任何*):字符串

方法實現

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

我的問題

但是,rc.invokeS0可以調用ANY函數,因此具有任意數量的參數。

我想構建一個包含函數名稱作爲一個字符串和參數作爲一個地圖的包裝方法。也許是這樣的:

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]轉換爲Seq[(String, String)]args.toSeq,然後使用_* ascription將它作爲參數序列而不是一個參數傳遞。

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

謝謝!那將如何處理參數名稱和參數值之間的' - >'操作符? – Jake

+1

它不是一個運營商。斯卡拉的運營商非常少。 ' - >'只不過是一種方法,由'Any'上的隱式轉換定義,從兩個值中創建一對。 'a - > b'表示與(a,b)相同的東西,但看起來更好。一個'Map [A​​,B]'變成一個'Seq'時,成爲一組鍵值對'(A,B)'。 – HTNW

+0

我會試一試!太感謝了。我會一定要upvote並接受工作 – Jake