gpt4 book ai didi

java - 使用 renjin 在 Java 和 R 之间 move 数据

转载 作者:太空宇宙 更新时间:2023-11-04 10:45:42 27 4
gpt4 key购买 nike

我正在尝试使用 Renjin 在 Java 和 R 之间 move 数据,反之亦然(作为数据帧)。在 Stackoverflow 中搜索时,我发现了一些东西,起初我认为它会起作用,但它不会起作用,因为我已经将 Java 中的 R 数据作为 externalptr 了。这是代码:

封装测试;

(省略导入)

公共(public)类TesteRenjin {

public static void main(String[] args) throws ClassNotFoundException {

List<Processos_Julgados> processosJulgados = new
ArrayList<Processos_Julgados>();

String driver = "com.mysql.jdbc.Driver";
String pwd = "";
String user = "root";
String url = "jdbc:mysql://localhost/cocaj_miner";
Connection con = null;

try {

Class.forName(driver);
con = DriverManager.getConnection(url, user, pwd);
System.out.println("Conexão bem sucedida");
String sql = "select ementa, numProcesso from processos_julgados where
ementa is not Null limit 15";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);

while (rs.next()) {

Processos_Julgados procJulg = new Processos_Julgados();
procJulg.setNumProcesso(rs.getString("numProcesso"));
procJulg.setEmenta(rs.getString("ementa"));
processosJulgados.add(procJulg);

}

} catch (SQLException e) {

System.out.println(e.getMessage());
//System.out.println("Conexão não foi possível");
} finally {

try {
con.close();
} catch (SQLException ex) {
Logger.getLogger(TesteRenjin.class.getName()).log(Level.SEVERE, null, ex);
}
}

StringArrayVector.Builder numProcParaR = new StringArrayVector.Builder();

for (Processos_Julgados processos : processosJulgados) {

numProcParaR.add(processos.getNumProcesso());

}

ListVector.NamedBuilder dfProcessos = new ListVector.NamedBuilder();

dfProcessos.setAttribute(Symbols.CLASS, StringVector.valueOf("data.frame"));
dfProcessos.setAttribute(Symbols.ROW_NAMES, new RowNamesVector(processosJulgados.size()));
dfProcessos.add("processos", numProcParaR.build());

RenjinScriptEngineFactory factory = new RenjinScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine();

engine.put("df", dfProcessos);

try {
engine.eval("str(df)");
} catch (ScriptException ex) {
Logger.getLogger(TesteRenjin.class.getName()).log(Level.SEVERE, null, ex);
}

}

}

你能帮我一下吗?

最佳答案

你就快到了。

java 对象dfProcessos 包含一个ListVector.NamedBuilder,而不是ListVectorListVector 实现 SEXP 接口(interface),因此将被视为普通 R 对象(或“S-Expression”),而所有其他 Java 对象(包括 Builder 对象)都需要包装在外部指针 R 对象中。

更改行:

engine.put("df", dfProcessos);

致:

engine.put("df", dfProcessos.build());

它应该可以工作。

关于java - 使用 renjin 在 Java 和 R 之间 move 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48443973/

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