2

我最近开始使用 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
4

1 回答 1

0

哦,我的,我已经找到了问题所在。一个愚蠢的。

当我为响应 Yehoshahat 的评论准备我的代码的紧凑版本时,我决定硬编码 TestEvent1A/1B/2C 的值(即rengine.eval("TestEvent1A <- 3"))。然后突然之间,predict() 起作用了。就在那时我意识到我正在这样做:

Matcher matcher = PAYLOAD.matcher(testEvent1A); if (matcher.find()) rengine.eval(String.format("TestEvent1A <- '%s'", matcher.group(1)));

当我应该这样做时:

Matcher matcher = PAYLOAD.matcher(testEvent1A); if (matcher.find()) rengine.eval(String.format("TestEvent1A <- %s", matcher.group(1)));

指出不同?当我打算输入整数/实数值时,我不小心用单引号将字符串值传递到了 TestEvent1A/1B/2C 中。啊啊啊啊。

感谢你们提供的所有帮助,BondedDust 和 Yehoshahat。非常感谢 :)

于 2015-02-05T17:46:40.130 回答