我最近开始使用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!)
library(rpart)
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];但是,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
答案 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。非常感谢:)