1

R と Java を RCaller と統合すると、スクリプト内で作成された変数が返されません。RCaller がどのように機能するかについて、根本的な誤解があるようです。環境内のすべての変数を Java から解析できるのではないでしょうか? どのように?

@Test
    public void test() {
        RCaller caller = new RCaller();
        RCode code = new RCode();
        caller.setRscriptExecutable("/usr/bin/Rscript");
        caller.runAndReturnResult("source('~/git/conjoint_it/src/main/r/a.R')");
        System.out.println(caller.getParser().getNames());

    }

aR:

...

m3 <- mlogit(choice ~ 0 + seat + cargo + eng 
             + as.numeric(as.character(price)), 
             data = cbc.mlogit)
su = summary(m3)
m3 #last line

これは [visible] のみを返します

4

2 に答える 2

1

RCaller を使用して、環境で定義されたすべての変数を処理できます。ここで、グローバル環境を使用するとします (これは、refclass または関数から変数を宣言する特別な最上位環境です)。

package org.expr.rcaller;

import java.util.ArrayList;
import org.expr.rcaller.Globals;
import org.expr.rcaller.RCaller;
import org.expr.rcaller.RCode;
import org.junit.Test;
import org.junit.Assert;

public class HandlingAllVariablesTest {

private final static double delta = 1.0 / 1000.0;

@Test
public void GetAllVariablesInEnvironmentTest() {
    RCaller caller = new RCaller();
    Globals.detect_current_rscript();
    caller.setRscriptExecutable(Globals.Rscript_current);

    RCode code = new RCode();

    code.addDouble("x", 5.65);
    code.addDouble("y", 8.96);
    code.addRCode("result <- as.list(.GlobalEnv)");

    caller.setRCode(code);

    caller.runAndReturnResult("result");

    ArrayList<String> names = caller.getParser().getNames();
    System.out.println("Names : " + names);

    System.out.println("x is " + caller.getParser().getAsDoubleArray("x")[0]);
    System.out.println("y is " + caller.getParser().getAsDoubleArray("y")[0]);

    Assert.assertEquals(caller.getParser().getAsDoubleArray("x")[0], 5.65, delta);
    Assert.assertEquals(caller.getParser().getAsDoubleArray("y")[0], 8.96, delta);
}}

このような結果:

名前 : [x, y]

x は 5.65

y は 8.96

ここがキーポイント

code.addRCode("result <- as.list(.GlobalEnv)");

そのため、グローバル環境で定義されたすべての変数をキャプチャする変数を定義しています。as.list() 関数は、環境オブジェクトをリストに変換します。2 番目の重要なポイントは、この変数を Java に転送することです。

caller.runAndReturnResult("結果");

ブログ ページWeb ページにアクセスすると、環境ではなく特定の変数をキャプチャする例をさらに見ることができます。

于 2015-05-19T21:06:42.193 に答える