我正在使用一些 R 代码来使用模型 BG-NBD 实现我正在使用 Java 并使用 RCaller 调用 R。我必须承认我对 R 真的很陌生,所以也许我做错了什么。我使用此 URL 上的代码:http ://code.google.com/p/clv-master-thesis/ 这是我的工作 Java 代码(一个简单的 Junit 测试):
@Test
public void testRCaller(){
try {
RCaller caller = new RCaller();
caller.setRscriptExecutable("/usr/bin/Rscript");
caller.cleanRCode();
RCode code = new RCode();
code.clear();
String helper = "/dati/helper.R";
String modelNbd = "/dati/model-nbd.R";
String modelParetoNbd = "/dati/model-pareto-nbd.R";
String modelBgNbd = "/dati/model-bg-nbd.R";
String modelCbgCnbd = "/dati/model-cbg-cnbd-k.R";
code.R_source(helper);
code.R_source(modelNbd);
code.R_source(modelParetoNbd);
code.R_source(modelBgNbd);
code.R_source(modelCbgCnbd);
code.addRCode("cdData <- read.table(\"/dati/cdnow.csv\", head=T)");
code.addRCode("names(cdData)[2] <- \"x\";");
code.addRCode("bgMleFit <- bgEstimateParameters(cdData, list(r=1, alpha=2, a=1, b=2));");
code.addRCode("summary(bgMleFit);");
code.addRCode("cdBgParams <- as.list(coef(bgMleFit));");
code.addRCode("t <- 39;");
code.addRCode("cdBgCe <- bgConditionalForecast(cdData, cdBgParams, t);");
code.addRCode("(cdBgSumEstimate <- sum(cdBgCe));");
code.addRCode("(cdBgMsle <- mean((log(cdData$p2x+1)-log(cdBgCe+1))^2));");
code.addRCode("(corr <- cor(cdData$p2x, cdBgCe));");
caller.setRCode(code);
caller.runAndReturnResult("cdBgCe");
ROutputParser parser = caller.getParser();
ArrayList<String> nomi = parser.getNames();
for (String nome : nomi) {
double[] previsioni = parser.getAsDoubleArray(nome);
logger.info("Nome "+nome+" lunghezza valori "+previsioni.length);
for (int i = 0; i < previsioni.length; i++) {
logger.info("Valore "+ previsioni[i]);
}
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
通过运行这段代码,一切都很好;现在我不想使用 csv 文件作为数据源;我想查询数据库并将数据传递给 R 据我所知,R read.table 函数通过读取提供的 csv 文件构建一个 data.frame。所以我所做的是:我使用 Java 来读取 csv 并编写了这段代码(在我读取了 csv 文件之后,为了简洁起见,我没有编写与 csv 读取相关的代码):
@Test
public void testRCaller(){
try {
RCaller caller = new RCaller();
caller.setRscriptExecutable("/usr/bin/Rscript");
caller.cleanRCode();
RCode code = new RCode();
code.clear();
String helper = "/dati/helper.R";
String modelNbd = "/dati/model-nbd.R";
String modelParetoNbd = "/dati/model-pareto-nbd.R";
String modelBgNbd = "/dati/model-bg-nbd.R";
String modelCbgCnbd = "/dati/model-cbg-cnbd-k.R";
code.R_source(helper);
code.R_source(modelNbd);
code.R_source(modelParetoNbd);
code.R_source(modelBgNbd);
code.R_source(modelCbgCnbd);
Map<String, Object> data = this.readCsvData();
StringBuilder userIds = new StringBuilder("ID <- c(");
long[] utenti = (long[])data.get("userIds");
int[] ordini = (int[]) data.get("ordini");
double[] tx = (double[]) data.get("tx");
double[] t = (double[])data.get("t");
int[] p2x = (int[]) data.get("p2tx");
for(int i = 0; i < utenti.length; i++){
userIds.append(utenti[i]+", ");
}
//here i check if the stringbuilder ends with, and i clean it...checkSb is simply an utility method
userIds = checkSb(userIds).append(");");
code.addIntArray("p1x", ordini);
code.addDoubleArray("tx", tx);
code.addDoubleArray("t", t);
code.addIntArray("p2x", p2x);
code.addRCode("cdData<-data.frame(ID , p1x, tx, t, p2x);");
code.addRCode("names(cdData)[2] <- \"x\";");
code.addRCode("bgMleFit <- bgEstimateParameters(cdData, list(r=1, alpha=2, a=1, b=2));");
code.addRCode("summary(bgMleFit);");
code.addRCode("cdBgParams <- as.list(coef(bgMleFit));");
code.addRCode("t <- 39;");
code.addRCode("cdBgCe <- bgConditionalForecast(cdData, cdBgParams, t);");
code.addRCode("(cdBgSumEstimate <- sum(cdBgCe));");
code.addRCode("(cdBgMsle <- mean((log(cdData$p2x+1)-log(cdBgCe+1))^2));");
code.addRCode("(corr <- cor(cdData$p2x, cdBgCe));");
caller.setRCode(code);
caller.runAndReturnResult("cdBgCe");
ROutputParser parser = caller.getParser();
ArrayList<String> nomi = parser.getNames();
for (String nome : nomi) {
double[] previsioni = parser.getAsDoubleArray(nome);
logger.info("Nome "+nome+" lunghezza valori "+previsioni.length);
for (int i = 0; i < previsioni.length; i++) {
logger.info("Valore "+ previsioni[i]);
}
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
如您所见,除了我不使用 read.table 函数之外,代码与前一个完全相似。那么通过执行这段代码我有一个错误。起初我认为 Java 代码中有一些错误,但我检查并没有出现错误然后我在 R 控制台中尝试了代码。好吧,我有一些很奇怪的东西。让我们从这条指令开始(int数组是从csv文件中恢复的):
int[] ordini = (int[]) data.get("ordini");
code.addIntArray("p1x", ordini);
此 Java-RCaller 指令生成此 R 代码:p1x<-c(..........)。更确切地说,生成的 R 代码如下(准备好:它很大):
p1x<-c(2, 1, 0, 0, 0, 7, 1, 0, 2, 0, 5, 0, 0, 0, 0, 0, 10, 1, 3, 0, 2, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 12, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 0, 4, 0, 1, 0, 0, 0, 2, 0, 0, 3, 0, 0, 1, 0, 1, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 7, 0, 10, 0, 0, 1, 6, 0, 0, 0, 0, 0, 2, 4, 1, 5, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 3, 0, 1, 2, 0, 1, 2, 0, 2, 1, 1, 0, 5, 2, 7, 2, 0, 4, 13, 0, 4, 4, 0, 0, 1, 0, 1, 29, 0, 3, 0, 0, 1, 0, 10, 0, 0, 13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 6, 8, 0, 0, 0, 1, 0, 4, 0, 2, 3, 3, 0, 0, 0, 0, 0, 6, 0, 1, 0, 0, 2, 0, 2, 2, 0, 0, 1, 0, 1, 0, 0, 7, 0, 0, 0, 2, 0, 4, 0, 1, 1, 0, 0, 0, 0, 0, 2, 0, 1, 1, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 5, 0, 0, 2, 0, 1, 2, 0, 0, 1, 0, 1, 0, 5, 0, 0, 1, 2, 0, 1, 0, 0, 1, 2, 1, 0, 1, 0, 1, 0, 3, 1, 13, 0, 0, 0, 0, 0, 3, 3, 1, 0, 0, 3, 0, 5, 0, 2, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 3, 1, 1, 0, 1, 0, 0, 0, 4, 0, 2, 0, 3, 0, 0, 1, 0, 1, 0, 2, 0, 1, 3, 25, 0, 0, 0, 0, 5, 0, 2, 0, 0, 0, 5, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 2, 1, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 2, 4, 0, 0, 1, 3, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 11, 0, 0, 4, 0, 0, 1, 2, 0, 0, 0, 0, 1, 1, 0, 3, 1, 0, 0, 2, 0, 8, 1, 0, 2, 1, 0, 0, 1, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 2, 4, 0, 0, 2, 0, 6, 0, 1, 0, 1, 1, 1, 2, 1, 0, 7, 4, 0, 0, 0, 7, 0, 1, 1, 0, 2, 1, 0, 4, 0, 1, 0, 0, 2, 0, 0, 4, 0, 0, 2, 1, 0, 1, 0, 11, 0, 4, 0, 0, 0, 4, 0, 3, 0, 1, 1, 0, 0, 6, 3, 0, 0, 0, 0, 2, 0, 2, 0, 18, 0, 1, 0, 1, 0, 0, 0, 5, 0, 1, 0, 6, 0, 2, 0, 0, 2, 0, 1, 1, 0, 0, 1, 0, 1, 2, 0, 0, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 1, 10, 0, 1, 3, 3, 0, 2, 0, 0, 12, 0, 1, 2, 2, 0, 0, 0, 0, 5, 0, 0, 2, 0, 5, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 1, 7, 0, 0, 2, 0, 0, 2, 0, 4, 0, 0, 3, 0, 1, 0, 2, 2, 0, 1, 1, 2, 0, 0, 0, 0, 2, 0, 0, 1, 0, 1, 0, 3, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 2, 1, 1, 0, 0, 0, 0, 5, 1, 0, 0, 1, 2, 1, 0, 0, 0, 0, 1, 0, 8, 1, 0, 6, 1, 2, 0, 3, 6, 0, 1, 0, 2, 5, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 13, 0, 0, 1, 3, 0, 5, 0, 2, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 4, 6, 1, 2, 0, 0, 2, 0, 7, 0, 0, 0, 0, 0, 3, 0, 5, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 0, 1, 0, 0, 1, 10, 0, 0, 0, 0, 3, 3, 0, 0, 2, 5, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 3, 1, 0, 0, 0, 0, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 0, 1, 0, 2, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 1, 13, 7, 0, 0, 3, 0, 1, 0, 1, 1, 2, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 2, 1, 0, 0, 1, 19, 2, 2, 0, 2, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 2, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 2, 0, 1, 1, 0, 0, 4, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 5, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 7, 2, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 4, 0, 1, 1, 0, 1, 0, 1, 2, 0, 1, 0, 0, 0, 2, 0, 4, 0, 1, 7, 1, 0, 1, 0, 0, 4, 0, 1, 0, 0, 0, 0, 1, 0, 7, 1, 0, 6, 0, 5, 0, 2, 0, 1, 0, 6, 0, 2, 0, 0, 0, 2, 2, 0, 0, 6, 0, 0, 1, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 1, 4, 0, 0, 1, 0, 1, 0, 0, 1, 0, 5, 2, 0, 0, 0, 3, 0, 12, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 1, 0, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 4, 0, 0, 2, 0, 5, 0, 3, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 3, 0, 0, 0, 0, 11, 0, 0, 2, 0, 1, 0, 7, 0, 0, 1, 0, 3, 0, 2, 0, 1, 0, 4, 2, 2, 1, 0, 0, 0, 0, 0, 1, 3, 0, 0, 1, 1, 6, 0, 0, 4, 0, 0, 1, 0, 2, 0, 1, 3, 7, 2, 0, 5, 0, 0, 0, 0, 5, 0, 12, 1, 0, 1, 0, 1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 4, 0, 1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 3, 4, 1, 0, 2, 1, 2, 1, 0, 0, 2, 1, 0, 0, 0, 1, 7, 0, 6, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 3, 0, 8, 0, 1, 0, 0, 2, 0, 0, 11, 0, 1, 8, 0, 1, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 3, 1, 0, 1, 6, 0, 2, 1, 1, 0, 1, 1, 0, 3, 2, 0, 0, 0, 2, 1, 1, 0, 0, 0, 0, 3, 2, 0, 3, 0, 0, 1, 4, 0, 6, 0, 1, 1, 4, 0, 2, 0, 4, 0, 0, 0, 0, 2, 0, 1, 0, 1, 2, 0, 0, 1, 0, 0, 2, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 1, 3, 2, 0, 0, 0, 1, 0, 0, 0, 4, 0, 1, 3, 0, 0, 0, 0, 0, 0, 3, 1, 0, 1, 1, 2, 0, 2, 0, 0, 0, 3, 0, 1, 0, 1, 0, 9, 0, 0, 4, 0, 2, 0, 5, 0, 0, 1, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 4, 1, 0, 0, 1, 5, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 3, 0, 0, 2, 0, 14, 4, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 3, 0, 2, 0, 0, 1, 1, 6, 1, 6, 0, 1, 2, 0, 0, 2, 1, 0, 2, 1, 0, 1, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 5, 0, 2, 0, 1, 0, 5, 0, 1, 2, 0, 2, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 4, 0, 1, 0, 0, 3, 1, 0, 2, 0, 2, 1, 0, 0, 0, 4, 0, 0, 0, 26, 1, 6, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 1, 2, 0, 1, 0, 0, 0, 14, 0, 1, 0, 2, 4, 0, 1, 6, 0, 0, 1, 3, 1, 0, 0, 0, 0, 1, 1, 0, 8, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 3, 0, 1, 1, 1, 1, 0, 1, 9, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 2, 0, 4, 1, 0, 0, 0, 0, 0, 0, 2, 0, 1, 1, 1, 0, 3, 2, 0, 2, 5, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 5, 1, 0, 1, 0, 4, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 2, 4, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 1, 1, 0, 0, 3, 3, 0, 2, 0, 1, 0, 1, 0, 0, 0, 5, 1, 3, 0, 2, 1, 0, 1, 0, 0, 0, 1, 0, 2, 0, 0, 0, 2, 3, 0, 0, 5, 0, 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 9, 2, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 4, 0, 4, 3, 0, 3, 2, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 3, 2, 2, 0, 0, 3, 2, 4, 0, 7, 1, 2, 0, 2, 2, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 3, 0, 0, 1, 6, 0, 1, 0, 2, 3, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 9, 4, 2, 0, 0, 1, 4, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 5, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 7, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 15, 0, 1, 0, 2, 0, 0, 3, 0, 0, 0, 0, 1, 0, 21, 2, 0, 0, 0, 3, 0, 0, 3, 2, 1, 0, 0, 1, 1, 1, 0, 0, 1, 2, 2, 1, 0, 0, 4, 0, 0, 0, 2, 0, 0, 1, 0, 1, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 1, 0, 0, 6, 0, 11, 0, 0, 1, 1, 0, 1, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 17, 2, 2, 0, 2, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 1, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 7, 0, 0, 1, 0, 0, 3, 0, 0, 2, 4, 0, 1, 0, 0, 0, 0, 2, 1, 0, 4, 2, 0, 0, 1, 3, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 1, 0, 1, 1, 3, 3, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 1, 1, 0, 2, 0, 2, 0, 3, 0, 4, 0, 1, 1, 0, 0, 1, 0, 3, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 0, 6, 0, 0, 0, 0, 3, 0, 0, 0, 2, 5, 0, 1, 0, 0, 1, 0, 1, 0, 0, 2, 0, 1, 2, 0, 0, 7, 0, 0, 2, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 8, 0, 0, 5, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 3, 0, 2, 0, 0, 0, 2, 1, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 2, 0, 0, 1, 0, 1, 2, 0, 0, 1, 0, 2, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 9, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 1, 1, 1, 0, 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 4, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 6, 0, 0, 0, 0, 1, 0, 0, 2, 6, 0, 1, 0, 0, 0, 0, 2, 0, 7, 0, 1, 2, 1, 1, 1, 0, 0, 1, 5, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 5, 1, 0, 1, 2, 0, 0, 1, 2, 0, 1, 0, 2, 0, 1, 2, 7, 1, 2, 0, 0, 0, 5, 0, 4, 0);
当我在 R 控制台中执行此功能时,我有一些奇怪的行为;有时它似乎在其他时候没有被执行,我有一个错误,比如“Unexpected element in......”,我真的不知道我错在哪里......相反,如果我使用“read.table功能”一切都很好。你能给我一些建议吗?我哪里错了吗?