2016-06-13 77 views
0

我有一個問題,我現在正試圖解決幾個問題。這個問題聽起來像這樣:將R函數作爲Java方法參數傳遞

我在R A功能:

f <- function(x) { 
    x^3 - x^2 - 4 * x + 2; 
} 

,但我想用它在Java中,舉例如下:double y = f(5)

我該怎麼做?


現在,我在R中使用rJava包來使用java代碼。我需要將此函數作爲參數發送給java方法並計算其中的函數(當然,我可以在R中調用函數並僅發送結果,但事實並非如此,我需要Java中的函數作爲一個整體)。

+0

'java.util.Math.pow(int a,int b)'返回'a^b'的值。但是對於你的小國,如果你願意,你可以使用'x * x * x'和'x * x'。如果權力特別不是你的問題,那麼是什麼?你想要一個關於Java編程的教程嗎? – Gendarme

+0

你有什麼不明白的「例如」。我想爲複雜的多目標處理創建一個R項目,這在R中太昂貴了,我用Java構建它。我需要傳遞複雜的函數作爲參數(從R到Java),以便我可以使用Java處理這些函數。這些功能是輸入值。 – ashcrok

+0

你可能想看看這個問題:http://stackoverflow.com/questions/7451716/java-r-integration 有很多解決方案提供了一些可能工作,我認爲。 – Alos

回答

1

假設你正在使用你想建立一個呼叫功能的評估它的REngine API:

// get a reference to the function 
REXP fn = eng.parseAndEval("function(x) x^3 - x^2 - 4 * x + 2", null, false); 

// create a call and evaluate it 
REXP res = eng.eval(new REXPLanguage(new RList(new REXP[] { 
      fn, new REXPInteger(5) 
        })), null, true); 
System.out.println("Result: " + res.asDouble()); 

,你會得到

Result: 82.0 

很明顯,你可以使用new REXPSymbol("f")而不是fn如果您想保留R側的功能f。如果您想快速回答,請考慮使用rJava/JRI郵件列表stats-rosuda-devel

+0

很好!謝謝。這是一個很好的方法,我會稍後再嘗試。現在我在R中做了評估部分,並在我的算法Java代碼中調用了每次迭代,並不是那麼昂貴,因爲在一些測試中,rJava比Java本身浪費了大約0.0005秒。 – ashcrok