【问题标题】:Rengine.eval() return null when calling predict()调用 predict() 时 Rengine.eval() 返回 null
【发布时间】: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 ];但是,fitpredict_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::rpart fit 对象应该是一个列表对象,它的第一个元素是'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

标签: r jri


【解决方案1】:

哦,天哪,我已经找到了问题所在。一个笨蛋。

当我为响应 Yehoshaphat 的评论准备我的代码的紧凑版本时,我决定硬编码 TestEvent1A/1B/2C 的值(即rengine.eval("TestEvent1A &lt;- 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 和 Yehoshaphat。非常感谢:)

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多