我最近开始使用 JRI 在 Java 中运行 R 代码/脚本。尽管大多数语句看起来都可以正常工作(例如简单的赋值Test <- 123
和特定的函数,如source(...)
read.csv(...)
, rpart(...)
, data.frame(...)
),但有一个函数总是会返回 null:predict(...)
。
具体来说,我一直在尝试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")
并通过 read.csv() 从 CSV 文件中读取 training_set;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)}])]
分别 - 都包含我放入测试的数据。这可能是问题的根源吗?
编辑#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