【发布时间】:2015-03-29 04:47:52
【问题描述】:
我最近开始使用 JRI 在 Java 中运行 R 代码/脚本。虽然大多数语句似乎都可以正常工作(例如简单的赋值 Test <- 123,以及特定的函数,如 source(...) read.csv(...)、rpart(...)、data.frame(...)),但有一个函数总是返回 null:@987654328 @。
具体来说,我一直在尝试运行rengine.eval("prediction <- predict(fit, predict_entry, type = \"class\")");,其中“fit”和“predict_entry”都不为空,并且似乎包含有效值。然后,当我尝试运行rengine.eval("prediction") 时,结果始终为空。
我不确定我是否遗漏了一些导致问题的库路径 - 请注意,相同的命令直接在 RStudio 控制台上运行良好。我的 java.library.path 和 R_HOME 的输出看起来也正确:
System.getProperty("java.library.path"): C:\Users\...\Documents\R\win-library\3.1\rJava\jri\x64;C:\Program Files\R\R-3.1.1\bin\x64
System.getenv("R_HOME"): C:/Program Files/R/R-3.1.1
是否有人对可能出现的问题有任何建议?请告诉我。
谢谢!
编辑:以下是我错过的一些附加信息(感谢您指出 BondedDust!)
- 我的 rpart() 函数带有基础 R,并通过
library(rpart)导入 - 创建“fit”的调用:
fit <- rpart(Verdict ~ TestEvent1A + TestEvent1B + TestEvent2C, data=training_set, method="class")和 training_set 是通过 read.csv() 从 CSV 文件中读取的; Verdict、TestEvent1A、TestEvent1B 和 TestEvent2C 是该 CSV 文件的列标题 - 非常好的调用 -
terms(fit)和str(predict_entry)从 rengine.eval() 返回 [NULL ];但是,fit和predict_entry单独返回[VECTOR ([VECTOR ([FACTOR {levels=("<leaf>","TestEvent1A","TestEvent1B","TestEvent2C"),ids=(2,3,0,2,0,0,1,3,0,0,0)}], [INT* (500, 409, 329, 80, 26, 54, 91, 68, 33, 35, 23)], [REAL* (500.0, 409.0, 329.0, 80.0, 26.0, 54.0, ...和[VECTOR ([FACTOR {levels=("1"),ids=(0)}], [FACTOR {levels=("5"),ids=(0)}], [FACTOR {levels=("3"),ids=(0)}])]- 两者都包含我放入测试的数据。这可能是问题的根源吗?
EDIT#2:我尝试在 RStudio 控制台上运行 term(fit) 和 str(predict_entry),并得到以下输出(不是 NULL!)
> terms(fit)
Verdict ~ TestEvent1A + TestEvent1B + TestEvent2C
attr(,"variables")
list(Verdict, TestEvent1A, TestEvent1B, TestEvent2C)
attr(,"factors")
TestEvent1A TestEvent1B TestEvent2C
Verdict 0 0 0
TestEvent1A 1 0 0
TestEvent1B 0 1 0
TestEvent2C 0 0 1
attr(,"term.labels")
[1] "TestEvent1A" "TestEvent1B" "TestEvent2C"
attr(,"order")
[1] 1 1 1
attr(,"intercept")
[1] 1
attr(,"response")
[1] 1
attr(,".Environment")
<environment: R_GlobalEnv>
attr(,"predvars")
list(Verdict, TestEvent1A, TestEvent1B, TestEvent2C)
attr(,"dataClasses")
Verdict TestEvent1A TestEvent1B TestEvent2C
"numeric" "numeric" "numeric" "numeric"
> str(predict_entry)
'data.frame': 1 obs. of 3 variables:
$ TestEvent1A: num 1
$ TestEvent1B: num 5
$ TestEvent2C: num 3
【问题讨论】:
-
您没有指出
rpart函数可能来自哪个包。您应该发布该信息,以及创建fit的调用,以及terms(fit)和str(predict_entry)的结果 -
感谢您的评论,我会更新我原来的帖子。
-
一个
rpart::rpartfit 对象应该是一个列表对象,它的第一个元素是'frame',第二个是'where',你可以在?'rpart.object'查找其他名称。名为“级别”的项目应该在附加到对象的属性中。 -
感谢 BondedDust 的进一步帮助。非常感激。我实际上有点困惑 - 我假设问题出在 JRI 上,因为完全相同的语句可以在 RStudio/R 控制台中成功运行。我非常严格地遵循本教程中介绍的语法:trevorstephens.com/post/72923766261/…。通过 JRI 从 Java 调用时,语句是否需要以不同的方式编写?
-
我无法真正说出您的代码是什么样的以及您的 Java 客户端 R-服务器是如何配置的(而且我什至不是高级中级。我试图描述应该在返回值中看到什么。有一个讨论 rJava 和 JRI 主题的邮件列表。mailman.rz.uni-augsburg.de/mailman/listinfo/stats-rosuda-devel