如何在Apache Camel中通过Rcode组件从Rserve获取结果到Java变量?
解决Apache Camel Rcode组件返回R变量值到Java的问题
我明白你的困扰——Rcode组件的文档确实不多,而且默认的print只会输出到Rserve控制台,没法直接把变量值带回Java。这里有个简单有效的方法来实现你的需求:
关键思路
Rserve的parse_and_eval操作会返回最后一个表达式的执行结果,而不是print的输出(print函数本身返回的是NULL)。所以我们需要调整R代码,让要返回的变量成为最后一个表达式,然后在Camel路由里处理这个返回值。
步骤1:修改你的R代码
把原来的:
c <-4; print(c);
改成:
c <-4; c
这样Rserve执行后会直接返回变量c的值,而不是打印输出。
步骤2:在Camel路由中处理返回值
Rcode组件会把R返回的结果封装成REXP对象(来自Rserve的Java客户端库),你可以把它转换成对应的Java类型,或者直接解析REXP来获取值。下面是修改后的路由示例:
from("activiti:testCamelTask:sendMsgToCamel", "direct://rcode_source") .setBody(simple(rSourceCode)) // 这里rSourceCode是修改后的R代码:"c <-4; c" .to("rcode://localhost:6311/parse_and_eval?bufferSize=4194304") // 转换为Java Integer类型(如果是浮点数可以用Double.class) .convertBodyTo(Integer.class) .process(exchange -> { // 获取返回的变量值并存入Java变量 Integer cValue = exchange.getIn().getBody(Integer.class); System.out.println("从R代码获取的c值:" + cValue); // 这里可以把cValue用于你的业务逻辑 }) .end();
处理复杂返回值(可选)
如果你的R代码返回的是列表、数据框等复杂对象,需要直接操作REXP对象来解析:
.process(exchange -> { REXP rexp = exchange.getIn().getBody(REXP.class); // 比如解析整数向量 int[] values = rexp.asIntegerArray(); // 解析列表的话可以用rexp.asList() })
这样就能轻松把R代码里的变量值带回Java代码中了!
内容的提问来源于stack exchange,提问作者Piyush Shrivastava
相关产品推荐
相关产品推荐

