2017-04-18 3 views
2

セッションはRenjinが説明されているようにスレッドセーフではありませんhereですが、リエントラントは安全ですか?Renjinセッションのリエントラントです

シナリオは、同じengine.eval( "..")メソッドを再度呼び出すJavaクラスを持つjava engine.eval( "...")からの呼び出しです。わかりやすくするために、エンジンインスタンスが1つしかないと仮定しましょう。

答えて

2

はい、可能です。

元のScriptEngineインスタンスでengine.eval()を呼び出すと、グローバル環境で式が評価され、R関数はJavaメソッドを呼び出したR呼び出しスタックを認識できなくなります。

呼び出されると、レンジに現在のContextをJavaメソッドに渡すように依頼することもできます。たとえば:

class MyJavaClass { 
    static SEXP estimate(@Current Context context, SEXP function) { 
     return context.evaluate(FunctionCall.newCall(function, IntVector.valueOf(42))); 
    } 
} 

そして:本当にうれしいです

import(MyJavaClass) 
f <- function(x) x*2 
MyJavaClass$estimate(f) # 84 
+0

、問題は彼のクエリでRコードを持っていることをR呼び出す「私たちのエンジン」を有するています。それは、文脈の観点からの徴候です。 – ic3

関連する問題