gpt4 book ai didi

java - 在 Java 中执行 R 命令以从 PostgreSQL 访问数据并进行计算时出错

转载 作者:行者123 更新时间:2023-12-01 12:46:22 24 4
gpt4 key购买 nike

我正在编写一个Java代码,其中我试图从PostgreSQL获取数据并对其进行简单的计算(计算中位数)。首先,我从 Java 代码本身加载 RPostgreSQL 库,然后加载驱动程序并通过 Java 建立 R 和 PostgreSQL 之间的连接。但是当我尝试通过 Java 触发查询命令(用于从 PostgreSQL 到 R 进行查询)时,我收到错误如下:

注意:此错误已解决。请查看下面的当前错误(脚本文件错误)

org.rosuda.REngine.REngineException: eval failed, request status: R parser: syntax error
org.rosuda.REngine.Rserve.RConnection.parseAndEval(RConnection.java:454)
org.rosuda.REngine.REngine.parseAndEval(REngine.java:108)
Rtemp.main(Rtemp.java:40)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:483)
com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

我当前的代码是:

import org.rosuda.REngine.REXP;
import org.rosuda.REngine.Rserve.*;

public class Rtemp {
public static void main(String[] args) throws Exception {
RConnection c = null;

try {
c = new RConnection();

//Loading RPostgreSQL library
REXP x = c.eval("library(RPostgreSQL)");

//Loading PostgreSQL driver
REXP drv = c.eval("dbDriver(\"PostgreSQL\")");

// Establishing connection
REXP r = c.parseAndEval("try(\"dbConnect(drv, host='localhost', port='5432',dbname='r1', user='postgres', password='pwd')\",silent=TRUE)");
if (r.inherits("try-error")) System.err.println("Error: "+r.asString());
else System.out.println("Success eval 1");


REXP rs = c.parseAndEval("try(dbSendQuery(r,\"select colmn1 from host_brnd345633456_table1 limit 10 \"), silent=TRUE)");
if (rs.inherits("try-error")) System.err.println("Error: "+rs.asString());
else System.out.println("Success eval 2");



REXP ftch = c.parseAndEval("try(ftch(rs,n=-1),silent=TRUE)");
if (ftch.inherits("try-error")) System.err.println("Error: "+ftch.asString());
else System.out.println("Success eval 3");

REXP res = c.parseAndEval("try(median(ftch$colmn1),silent=TRUE)");
if (res.inherits("try-error")) System.err.println("Error: "+res.asString());
else {
System.out.println("Success eval 4");
System.out.println(res.asDouble());
}
#The line 58 error mentioned below in the error section is coming at this line
System.out.println(res.asDouble());
//System.out.println(x.asString());
System.out.println("Library loaded successfully");
} catch(Exception e) {
e.printStackTrace();
} finally {
if ( c != null )
try {
c.close();
}
}
}
}

我认为 Rserve 连接没有任何问题,因为对于显示 R 版本之类的简单代码,它可以正确执行。

此外,将 R 写入 PostgreSQL 部分的命令(例如 dbSendQuery() 或类似命令)的语法没有问题,因为当我直接从 R 中使用它们时,它们工作得很好。所以,我认为问题在于用Java编写相同的内容(Java的相应语法)。

更新 1:错误 2(此错误已解决)

在接受@ on_the_shores_of_linux_sea 的建议后,我对代码进行了一些修改,但现在出现了一个不同的错误:

    Success eval 1
Error: Error in is(object, Cl) :
error in evaluating the argument 'conn' in selecting a method for function 'dbSendQuery': Error: object 'r' not found


Error: Error in is(object, Cl) :
error in evaluating the argument 'res' in selecting a method for function 'fetch': Error: object 'rs' not found


Error: Error in median(ftch$t31001400) : object 'ftch' not found

org.rosuda.REngine.REXPMismatchException: attempt to access org.rosuda.REngine.REXPString as double
at org.rosuda.REngine.REXP.asDoubles(REXP.java:77)
at org.rosuda.REngine.REXP.asDouble(REXP.java:103)
at Rtemp.main(Rtemp.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

Process finished with exit code 0

我无法弄清楚错误的原因以及如何解决它

第二个问题:这是一个第二问题,因为我也想知道我是否可以在文件(特殊的 R 格式文件或任何其他格式文件)中编写 R 查询或语句)然后让Java读取该文件并将R命令插入R中执行?

更新 2:脚本文件错误

下面@on_the_shores_of_linux_sea提到的方法1现在工作正常。我也尝试通过方法 2 进行操作,但在通过 Java 管理脚本时遇到一些困难。我使用的Java代码是:

public class Java_RScript {

public static void main(String[] args) throws Exception {
RConnection c = null;
try {
c = new RConnection();
c.parseAndEval("try(source("script.R"),silent=TRUE)");
REXP res = c.parseAndEval("try(\"do_operation()\", silent=TRUE)");
System.out.println("Success:" + res.asDouble());
} catch (Exception e) {

e.printStackTrace();

} finally {

if (c != null) {

try {

c.close();

} finally {
}

}

}

}
}

输出控制台上打印的错误如下:

org.rosuda.REngine.REXPMismatchException: attempt to access org.rosuda.REngine.REXPString as double

我的脚本文件语法是:

do_operation <- function()
{
drv <- dbDriver("PostgreSQL")
r <- dbConnect(drv, host='localhost', port='1234',dbname='db', user='user1', password='pswd')
rs <-dbSendQuery(r,"select colmn1 from hostess_table limit 10")
ftch <- fetch(rs,n=-1)
res <- median(ftch$colmn1)
return(res)
}

我不确定错误是在脚本文件中还是在我的 Java 语法中。

最佳答案

RENGINE 的工作原理是,它通过套接字连接到 Rserve session ,并通过 eval 或 parseAndEval 发送命令。 R session 不知道在 Java 中创建的任何变量,因此如果您在后续评估中使用这些变量,它将抛出错误

有两种方法可以解决您的问题

方法 1 - 在 eval 中分配变量

import org.rosuda.REngine.REXP;
import org.rosuda.REngine.Rserve.*;

public class Rtemp {
public static void main(String[] args) throws Exception {
RConnection c = null;

try {
c = new RConnection();

//Loading RPostgreSQL library
c.eval("library(RPostgreSQL)");
//Loading PostgreSQL driver
c.eval("drv <- dbDriver(\"PostgreSQL\")");

// Establishing connection
REXP r = c.parseAndEval("r <- try(\"dbConnect(drv, host='localhost', port='5432',dbname='r1', user='postgres', password='pwd')\",silent=TRUE)");
if (r.inherits("try-error")) System.err.println("Error: "+r.asString());
else System.out.println("Success eval 1");


REXP rs = c.parseAndEval("try(rs <-dbSendQuery(r,\"select colmn1 from host_brnd345633456_table1 limit 10 \"), silent=TRUE)");
if (rs.inherits("try-error")) System.err.println("Error: "+rs.asString());
else System.out.println("Success eval 2");



REXP ftch = c.parseAndEval("try(ftch <- ftch(rs,n=-1),silent=TRUE)");
if (ftch.inherits("try-error")) System.err.println("Error: "+ftch.asString());
else System.out.println("Success eval 3");

REXP res = c.parseAndEval("try(res <- median(ftch$colmn1),silent=TRUE)");
if (res.inherits("try-error")) System.err.println("Error: "+res.asString());
else {
System.out.println("Success eval 4");
System.out.println(res.asDouble());
}
#The line 58 error mentioned below in the error section is coming at this line
System.out.println(res.asDouble());
//System.out.println(x.asString());
System.out.println("Library loaded successfully");
} catch(Exception e) {
e.printStackTrace();
} finally {
if ( c != null )
try {
c.close();
}
}

}}

方法 2 - 使用 R 脚本并从代码中获取文件

文件脚本.R:

 require(PostgresSQL)
do_operation <- function()
{
r <- dbConnect(drv, host='localhost', port='5432',dbname='r1', user='postgres', password='pwd')\",silent=TRUE)
rs <-dbSendQuery(r,\"select colmn1 from host_brnd345633456_table1 limit 10
ftch <- ftch(rs,n=-1)
res <- median(ftch$colmn1)
return(res)
}

Java代码

  c = new RConnection();
c.eval("source('script.R')");
double res = c.eval("do_operation()").asDouble();

关于java - 在 Java 中执行 R 命令以从 PostgreSQL 访问数据并进行计算时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24665257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com