调用predict()时,Rengine.eval()返回null

时间:2015-01-29 20:01:31

标签: r jri

我最近开始使用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")时,结果始终为null。

我不确定是否错过了导致问题的库路径 - 请注意,相同的命令可以在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;判决,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)}])] - 两者都包含我投入测试的数据。这可能是问题的根源吗?

编辑#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

1 个答案:

答案 0 :(得分:0)

哦,我已经弄明白了。一个愚蠢的人。

当我准备一个紧凑版本的代码以回应Yehoshaphat的评论时,我决定对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)));

发现差异?当我打算输入整数/实数值时,我意外地将String值传入TestEvent1A / 1B / 2C并使用单引号。 Arghhghghghg。

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