Rcaller не возвращает переменные
При интеграции 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());
}
аЯ:
...
m3 <- mlogit(choice ~ 0 + seat + cargo + eng
+ as.numeric(as.character(price)),
data = cbc.mlogit)
su = summary(m3)
m3 #last line
это возвращает только [видимый]
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]
х 5,65
у 8,96
Вот ключевой момент
code.addRCode("result <- as.list (.GlobalEnv)");
поэтому мы определяем переменную для захвата всех переменных, определенных в глобальной среде. Функция as.list() преобразует объект среды в список. Вторым важным моментом является передача этой переменной в Java
caller.runAndReturnResult("результат");
Вы можете увидеть больше примеров захвата определенных переменных, а не сред, посетив страницу блога и веб-страницу.
Импорт:
import com.github.rcaller.rStuff.RCaller;
import com.github.rcaller.rStuff.RCode;
Код Java:
RCaller caller = new RCaller();
RCode code = new RCode();
caller.setRscriptExecutable("C:\\Program Files\\R\\R-4.0.2\\bin\\Rscript.exe");
caller.setRCode(code);
code.clear();
caller.cleanRCode();
//Methods to parse variables to the Rscript
code.addInt("mydata1", 5);
code.addDoubleArray("mydata2", new double[]{1, 2, 3, 4, 5});
code.addRCode("mydata3 <- 'Data'");
//Calling the Rscript
code.addRCode("source('./src/test.r')");
//Reciving Values from the Rscript through the result variable
caller.runAndReturnResult("result");
int data = caller.getParser().getAsIntArray("data")[0];
double mean = caller.getParser().getAsDoubleArray("mean")[0];
String text = caller.getParser().getAsStringArray("text")[0];
System.out.println(data);
System.out.println(mean);
System.out.println(text);
test.r:
result1 <- mydata1 * 2
result2 <- mean(mydata2)
result3 <- paste("Result3", mydata3, sep=" ")
result <- list(data=result1, mean=result2, text=result3)
Выход:
10
3.0
Result3 Data