首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rcaller不返回变量

Rcaller不返回变量
EN

Stack Overflow用户
提问于 2015-05-19 14:21:47
回答 2查看 397关注 0票数 1

在集成R、Java和RCaller时,我永远不会得到在脚本中创建的任何变量。似乎对RCaller的工作原理有一个根本性的误解。环境中的所有变量不都可以从Java中解析出来吗?多么?

代码语言:javascript
复制
@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());

    }

a.R:

代码语言:javascript
复制
...

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

这将返回仅可见

EN

回答 2

Stack Overflow用户

发布于 2015-05-20 05:06:42

您可以使用RCaller处理环境中定义的所有变量。现在我们假设您使用的是全局环境(这是一个特殊的顶级环境,您可以在其中声明来自refclass或函数的变量)。

代码语言:javascript
复制
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

Y为8.96

结果code.addRCode(“

<- as.list(.GlobalEnv)");

因此,我们定义一个变量来捕获全局环境中定义的所有变量。as.list()函数将环境对象转换为列表。第二个要点是通过以下方式将此变量传递到java

caller.runAndReturnResult("result");

通过访问blog pageweb page,您可以看到更多关于捕获特定变量而不是环境的示例。

票数 1
EN

Stack Overflow用户

发布于 2020-08-07 15:44:39

导入:

代码语言:javascript
复制
import com.github.rcaller.rStuff.RCaller;
import com.github.rcaller.rStuff.RCode;

Java代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
result1 <- mydata1 * 2
result2 <- mean(mydata2)
result3 <- paste("Result3", mydata3, sep=" ")

result <- list(data=result1, mean=result2, text=result3)

输出:

代码语言:javascript
复制
10
3.0
Result3 Data
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30318124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档