Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在Java中使用rJava(JRI)运行与字符串相关的函数_Java_R_Rjava_Jri - Fatal编程技术网

无法在Java中使用rJava(JRI)运行与字符串相关的函数

无法在Java中使用rJava(JRI)运行与字符串相关的函数,java,r,rjava,jri,Java,R,Rjava,Jri,我用Java(eclipse)编写了一个小程序,使用JRI(rjava)运行R。所有路径都已设置。问题是,虽然我可以运行数字函数(如add),但不能运行字符串函数(如cat)。(请原谅任何错误;我昨天第一次做了Java编码) 请帮助我理解为什么像cat这样的字符串函数不起作用。 以下是我当前获得的输出: ##############libpath=C:\Users\myname\Documents\R\win-library\3.3\rJava\jri\x64 Connected to R lo

我用Java(eclipse)编写了一个小程序,使用JRI(rjava)运行R。所有路径都已设置。问题是,虽然我可以运行数字函数(如
add
),但不能运行字符串函数(如
cat
)。(请原谅任何错误;我昨天第一次做了Java编码)

请帮助我理解为什么像
cat
这样的字符串函数不起作用。 以下是我当前获得的输出:

##############libpath=C:\Users\myname\Documents\R\win-library\3.3\rJava\jri\x64
Connected to R
loading RScript file || completed
mvalue=3.0
method to be called in RScript is cat("Advisory","Assurance")
null

为什么我最终会得到
null
?我应该得到
咨询保证

下面是一个如何将R输出显示为Java的示例。您基本上必须实现


它不会为您自动将R控制台“stdout”连接到Java“stdout”。您可以通过获取控制台输出的自动回调,但这意味着有一个主循环。使用
capture.output()
包装
cat
调用将使您能够以字符串形式获得结果(在示例代码中分配给
)。您可以将
,file='/some/dir/和/file.txt'
添加到
cat
调用中,并读取该文件的输出。
##############libpath=C:\Users\myname\Documents\R\win-library\3.3\rJava\jri\x64
Connected to R
loading RScript file || completed
mvalue=3.0
method to be called in RScript is cat("Advisory","Assurance")
null
import org.rosuda.JRI.RMainLoopCallbacks;
import org.rosuda.JRI.Rengine;
import java.util.logging.Logger;

public class Runner {

    private static Logger log = Logger.getLogger("Runner");

    static class LoggingConsole implements RMainLoopCallbacks {
        private Logger log;

        LoggingConsole(Logger log) {
            this.log = log;
        }

        public void rWriteConsole(Rengine re, String text, int oType) {
            log.info(String.format("rWriteConsole: %s", text));
        }

        public void rBusy(Rengine re, int which) {
            log.info(String.format("rBusy: %s", which));
        }

        public void rShowMessage(Rengine re, String message) {
            log.info(String.format("rShowMessage: %s",  message));
        }

        public String rReadConsole(Rengine re, String prompt, int addToHistory) {
            return null;
        }

        public String rChooseFile(Rengine re, int newFile) {
            return null;
        }

        public void rFlushConsole(Rengine re) {
        }

        public void rLoadHistory(Rengine re, String filename) {
        }

        public void rSaveHistory(Rengine re, String filename) {
        }
    }

    Rengine engine = new Rengine(new String[] {"--no-save"}, false, new LoggingConsole(log));
    ...
    // Use the engine somewhere to evaluate a R method and see the output
    engine.eval(rScriptSourceFile);
}