首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JRI -如何定位R中的错误

JRI -如何定位R中的错误
EN

Stack Overflow用户
提问于 2014-10-12 16:41:54
回答 2查看 816关注 0票数 2

基本上,我使用的是Java、JRI ( RJDBC )和RJDBC(在JRI的帮助下),它们都运行得很好。现在,我想使我的程序尽可能的万无一失。比方说,字符串SQL_command是某种垃圾,并不是一个有效的SQL-语句。那样的话..。

代码语言:javascript
复制
    re.eval("sql_data <- dbGetQuery(conn, \"" + SQL_command + "\")");

...should出错了。我的想法是这样的:如果R命令失败,R中就会有某种输出,如果一切都正确,就没有输出。但是我如何捕捉到可能的输出呢?

请记住,我的问题更多是关于如何捕获无效的R语句,因此对于可能的解决方案的任何其他建议也会受到赞赏。R输出不一定重要,但无论如何它可能是有趣的。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-12 18:48:24

我建议在R中直接捕获由于R代码引起的(可能的)异常,因此,如果我怀疑一个命令可能会出错,我会在R中使用try函数,如下所示:

代码语言:javascript
复制
       REXP y = re.eval("sql_data <- try(dbGetQuery(conn, \"" + SQL_command + "\"),silent=TRUE)");
       REXP x = re.eval("class(sql_data)");
       if ((x.asString()).equals("try-error")) {
          System.out.println(y.asString());
          // do something to catch the exception
       } else {
         // do normal stuff
       }

这样,您还可以显示R错误。

这里有一些可重复的代码(除了数据库凭据),它试图首先执行有效的查询语句,然后执行无效的查询语句。

代码语言:javascript
复制
      import java.io.*;
      import org.rosuda.JRI.*;
      public class Prova {
         public static void main(String[] args) {
           String[] commands = {"a<-try(dbGetQuery(conn,'show tables'))","a<-try(dbGetQuery(conn,'SS'))"};
           Rengine re=new Rengine (new String [] {"--vanilla"}, false, null);
           re.eval("require(RMySQL)");
           re.eval("conn<-dbConnect(MySQL(),user='xxx',password='xxx',dbname='xxx')");
           for (int i=0;i<2;i++) {
             REXP y = re.eval(commands[i]);
             REXP x = re.eval("class(a)");
             if ((x.asString()).equals("try-error")) {
               System.out.println(y.asString());
             } else {
               System.out.println(x.asString());
             }
           }
           re.end();
         }
      }

产出:

代码语言:javascript
复制
   data.frame
   Error in mysqlExecStatement(conn, statement, ...) : 
     RS-DBI driver: (could not run statement: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SS' at line 1)
票数 2
EN

Stack Overflow用户

发布于 2014-10-12 18:09:19

根据 method的说法,如果出了什么问题,null将被退回。该方法不会抛出任何类型的Exception,因此它似乎没有提供任何方法来确定问题的原因。

method确实抛出了几个Exception类型,即REngineExceptionREXPMismatchException,它们可能会提供更多的故障解释,但文档并不清楚这些类型将被抛出的确切原因和时间。

因此,您可以做的最好的事情就是检查一个null返回值。

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

https://stackoverflow.com/questions/26327475

复制
相关文章

相似问题

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