3

Rで次のような関数を作成したとしましょう

bin <- function(arg1, arg2, arg3) {
//some code here
}

Renjin を使用して JVM で R を実行しています。Java プログラムから、R 関数を呼び出したいと思いますbin。Rにアクセスするためだけに、最初にこれに似たものを使用する必要があることを知っています

ScriptEngineManager manager = new ScriptEngineManager();
// create a Renjin engine:
ScriptEngine engine = manager.getEngineByName("Renjin");

しかし、それが完了したら、R 関数に正確にアクセスするにはどうすればよいでしょうか? この関数は別のファイルに保存されます。Rスクリプトを実行するには(これを と呼びましょうscript.R)、使用することを知っています

engine.eval(new java.io.FileReader("script.R"));

しかし、それはファイル内の関数に引数を渡すことを許可しません...全体を実行するだけです。

Java プログラムで R/Renjin を使用して関数を書き直す必要がありますか? または、関数を呼び出す効率的な方法はありますか?

ありがとうございました!

4

1 に答える 1

4

走るとき

engine.eval(new java.io.FileReader("script.R"));

script.Rファイルが解析され、ファイル内のステートメントがグローバル環境で実行されます。ファイルが関数のみを定義している場合、実際には呼び出されません。

関数を実行するには、いくつかのオプションがあります。

  1. へのscript.R呼び出しを含むように拡張します。bin

    bin <- function(arg1, arg2, arg3) {
    //some code here
    }
    bin(arg1 = 1, arg2 = 2, arg3 = 3)
    
  2. Java コードでコマンドを評価script.R、構築、評価します。

    engine.eval(new java.io.FileReader("script.R"));
    

    に続く

    engine.eval("bin(arg1 = " + 1 + ", arg2 = " + 2 + ", arg3 = " + 3 + ")");
    
  3. を評価script.Rし、グローバル環境で変数を作成し、bin関数を実行します。

    engine.eval(new java.io.FileReader("script.R"));
    engine.eval("arg1 <- 1; arg2 <- 2; arg3 <- 3");
    engine.eval("bin(arg1, arg2, arg3)");
    

各オプションはさまざまなレベルの柔軟性を提供するため、どれが最適かを試すことができます。

于 2014-07-09T13:22:29.293 に答える