例外:"尝试访问org.rosuda.REngine.REXPGenericVector为String"

时间:2014-07-24 06:14:50

标签: java r exception eval

我有以下函数来读取csv(包含18000行和21列)并在java控制台中显示其内容。

public void rFun() {

    Rsession instance = RConnect.getInstance();

    instance.eval("load(\".RData\")");

    instance.eval("g <- read.csv(\"Book2.csv\")");

    REXP x = instance.eval("hh <- head(g,2)");

    REXP x1 = instance.eval("nrow(hh)");
    REXP x2 = instance.eval("ncol(hh)");
    try {


        int i = 0;  
        for(int j=0; j<x1.asInteger(); j++){
                for(int k=0; k<x2.asInteger(); k++){
            System.out.println("Element ["+(j+1)+"]["+(k+1)+"] = "+x.asStrings()[i]);
                i++;
                }
            }

    } catch (REXPMismatchException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

但是当我执行这个函数时,我得到了这个异常: 尝试将org.rosuda.REngine.REXPGenericVector作为String访问。 如果我创建一个如下所示的数据框,这段代码正在工作:

instance.eval("xyz <- matrix(c(10,20,3,\"A\",40,50,60),nrow=2)");             
REXP x = instance.eval("df <- as.data.frame(xyz)");

我尝试将每列的数据类型转换为字符,然后检索该值,但抛出相同的异常。请帮忙。

1 个答案:

答案 0 :(得分:1)

使用以下语法:

for(int i=1; i<=x1.asInteger(); i++){
    for(int j=1; j<=x2.asInteger(); j++){
                     REXP cls1 = instance.eval("c1 <- h["+i+","+j+"]");
                     System.out.println(cls1.asString());
    }
}

无需将数据类型转换为字符。希望它有所帮助。