首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R,Java,RCaller

R,Java,RCaller
EN

Stack Overflow用户
提问于 2014-08-10 10:41:45
回答 2查看 761关注 0票数 1

因此,我试图使用RCaller来执行以下操作(在psuedo代码中):

代码语言:javascript
复制
x=simarray(..) // in java

'send x to R'

run y = rlogcon(40000, sort(x)) //in R, rlogcon is part of rlogcondens and the function 
produces a numeric vector of length 40000

//send y to java and hold it in a double matrix.

这就是我的主要功能(我已经修改了我找到的一个例子,但我一定是犯了错误/误解了什么。我在我的机器上测试了这个示例,它正常工作了):

代码语言:javascript
复制
    RCaller caller = new RCaller(); 
    RCode code = new RCode(); 
    double[] x = a.simarraysimbeta(5, 1, 100, 30, 40); //some method
    savesample("simarraysimbeta.txt",x); //testing, it works.

    caller.setRscriptExecutable("C:\\Program Files\\R\\R-3.1.0\\bin\\Rscript.exe"); 

    code.addDoubleArray("X", x);
    code.addRCode("library(logcondens)"); //rlogcon is part of logcondens library
    code.addRCode("ols <- rlogcon(40,000, sort(X))"); 


    caller.setRCode(code); 

    caller.runAndReturnResult("ols"); 

    double[] residuals = caller.getParser().getAsDoubleArray("X_star"); 

和下列相关进口:

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

我得到以下错误:

代码语言:javascript
复制
 Exception in thread "main" rcaller.exception.ParseException: Can not
 handle R results due to : rcaller.exception.ParseException: Can not
 parse output: The generated file
 C:\Users\jo\AppData\Local\Temp\Routput8804446513483695061 is empty

这里是输出:

代码语言:javascript
复制
    concat<-function(to,...){
        to<-paste(to,toString(...),sep="");
        return(to);
    }

    cleanNames<-function(names){
        cleanNames<-paste(unlist(strsplit(names,"\\.")),collapse="_");
   Exception in thread "main" rcaller.exception.ParseException: Can not
   handle R results due to : rcaller.exception.ParseException: Can not
   parse output: The generated file
   C:\Users\jo\AppData\Local\Temp\Routput8804446513483695061 is empty
        cleanNames<-paste(unlist(strsplit(cleanNames,"<")),collapse="");
        at rcaller.RCaller.runAndReturnResult(RCaller.java:409)
        cleanNames<-paste(unlist(strsplit(cleanNames,">")),collapse="");
        at dissertation.Dissertation.main(Dissertation.java:709)
        cleanNames<-paste(unlist(strsplit(cleanNames," ")),collapse="");
        cleanNames<-paste(unlist(strsplit(cleanNames,"\\(")),collapse="");
        cleanNames<-paste(unlist(strsplit(cleanNames,"\\)")),collapse="");
        cleanNames<-paste(unlist(strsplit(cleanNames,"\\[")),collapse="");
        cleanNames<-paste(unlist(strsplit(cleanNames,"\\]")),collapse="");
        cleanNames<-paste(unlist(strsplit(cleanNames,"\\*")),collapse="");
        return(cleanNames);
    }

    makevectorxml<-function(code,objt,name=""){
            xmlcode<-code;
        if(name==""){
                varname<-cleanNames(deparse(substitute(obj)));
            }else{
                    varname<-name;
            }
        obj<-objt;  
            n <- 0; m <- 0
            mydim <- dim(obj)
            if(!is.null(mydim)){
                n <- mydim[1]; m <- mydim[2];
            }else{
                n <- length(obj); m <- 1;
            }
        if(is.matrix(obj)) obj<-as.vector(obj);
        if(typeof(obj)=="language") obj<-toString(obj);
        if(typeof(obj)=="logical") obj<-as.character(obj);
                    if(is.vector(obj) && is.numeric(obj)){
                            xmlcode<-paste(xmlcode,"<variable name=\"",varname,"\" type=\"numeric\" n=\"", n, "\"  m=\"", m, "\">",sep="");
                for (i in obj){
                                xmlcode<-paste(xmlcode,"<v>",sep="");
                    xmlcode<-paste(xmlcode,toString(i),sep="");
                                xmlcode<-paste(xmlcode,"</v>",sep="");
                }
                            xmlcode<-paste(xmlcode,"</variable>\n",sep="");
                    }
                    if(is.vector(obj) && is.character(obj)){
                            xmlcode<-paste(xmlcode,"<variable name=\"",varname,"\" type=\"character\">\n",sep="");
                            for (i in obj){
                                    xmlcode<-paste(xmlcode,"<v>",sep="");
                                    xmlcode<-paste(xmlcode,toString(i),sep="");
                                    xmlcode<-paste(xmlcode,"</v>",sep="");
                            }
                xmlcode<-paste(xmlcode,"</variable>\n");
                    }
            return(xmlcode);
    }


    makexml<-function(obj,name=""){
        xmlcode<-"<?xml version=\"1.0\"?>\n";
        xmlcode<-concat(xmlcode,"<root>\n");
        if(!is.list(obj)){
                    xmlcode<-makevectorxml(xmlcode,obj,name);
            }
            else{
                    objnames<-names(obj);
                    for (i in 1:length(obj)){
                xmlcode<-makevectorxml(xmlcode,obj[[i]],cleanNames(objnames[[i]]));
            }
            }
        xmlcode<-concat(xmlcode,"</root>\n");
        return(xmlcode);
    }



    X<-c(##100 doubles);
    library(logcondens)
    ols <- rlogcon(40,000, sort(X))
    cat(makexml(obj=ols, name="ols"), file="C:/Users/##/AppData/Local/Temp/Routput8804446513483695061")
EN

回答 2

Stack Overflow用户

发布于 2014-08-11 00:21:59

在你的代码中,40,000应该是40000。

票数 2
EN

Stack Overflow用户

发布于 2016-02-26 07:56:41

文件保持空有两种方式:

  • R code中有一个错误
  • 结果是NULLNA

我建议您在tryCach中使用R

代码语言:javascript
复制
ols <- tryCatch({
   rlogcon(40,000, sort(X))
}, error = function(e) {
   -1
})

最后,如果ols equlas -1,您将知道R中有一个错误

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25227772

复制
相关文章

相似问题

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