2017-08-24 1 views
1

Ich bin scala sehr neu.Scala: Funktion dynamisch aufrufen

Ich verwende rscala, um mit R-Funktionen zu integrieren. Zum Beispiel verwende ich die folgende Methode, um eine R-Funktion aufzurufen und einen String-Wert zu retreive.

Methode Signatur:

def invokeS0 (Funktion: Reference, argumente: Alles *): String

Implementierung der Methode

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

Mein Problem

Allerdings kann rc.invokeS0 jede Funktion aufrufen und somit eine beliebige Anzahl von Argumenten haben.

Ich denke über den Aufbau einer Wrapper-Methode, die den Funktionsnamen als String und Argumente als Map nimmt. Vielleicht etwas in der Art:

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) 
} 

Aber ich bin mir nicht sicher, wie man den Code schreibt, da die Anzahl der Argumente dynamisch ist. Ehrlich gesagt bin ich mir nicht sicher, ob das möglich ist, aber ich dachte, ich würde es überprüfen, nur für den Fall.

Alle Hinweise würden sehr geschätzt werden.

Antwort

2

umrechnen Map[String, String] in eine Seq[(String, String)] mit args.toSeq und dann die _* ascription verwenden Sie es als eine Folge von Argumenten nur einen statt zu passieren.

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

Danke! Wie geht das mit dem Operator '->' zwischen Parametername und Parameterwert? – Jake

+1

Es ist kein Operator. Scala hat sehr wenige Betreiber. '->' ist einfach eine Methode, definiert durch implizite Konvertierung von 'Any', die ein Paar aus zwei Werten erzeugt. 'a -> b 'bedeutet dasselbe wie' (a, b) ', sieht aber schöner aus. Eine 'Map [A, B]', wenn sie in eine 'Seq' umgewandelt wird, wird zu einer Gruppe von Schlüssel/Wert-Paaren' (A, B) '. – HTNW

+0

Ich werde es versuchen! Tausend Dank. Ich werde sicher sein, zu upvote und zu akzeptieren, wenn – Jake

Verwandte Themen