【发布时间】:2015-11-03 13:14:40
【问题描述】:
我正在使用Rserve 从 Java 中连接 R。只有当我通过 Java 访问它时,我才在 R 中使用库函数时遇到问题。以下是详细信息:
在 Java 中,我有四个 float 数组。这些用作 R 的OrgMassSpecRpackage 中的SpectrumSimilarity 函数的输入。要使用Rserve 将这些浮点数组作为输入提供,我首先必须将它们转换为字符串数组。代码如下:
String[] consensusIMzString = new String[consensusIMz.length];
String[] consensusIIntString = new String[consensusIInt.length];
String[] referenceJMzString = new String[referenceJMz.length];
String[] referenceJIntString = new String[referenceJInt.length];
System.out.println("Filename 1: " + fileNameOfI + "Filename 2: " + fileNameOfJ);
for(int i = 0; i < consensusIMz.length;i++)
{
consensusIMzString[i] = Float.toString(consensusIMz[i]);
consensusIIntString[i] = Float.toString(consensusIInt[i]);
}
for(int j = 0; j < referenceJMz.length; j++)
{
referenceJMzString[j] = Float.toString(referenceJMz[j]);
referenceJIntString[j] = Float.toString(referenceJInt[j]);
}
try {
RConnection rc = new RConnection();
rc.assign("generateSimilarityScore", currentDirPath.concat("/generateSimilarityScore.R"));
rc.eval("source(generateSimilarityScore)");
rc.assign("referenceJMzString", referenceJMzString);
rc.assign("referenceJIntString", referenceJIntString);
rc.assign("consensusIMzString",consensusIMzString);
rc.assign("consensusIIntString", consensusIIntString);
rc.assign("commonMassWindowThreshold", Float.toString(commonMassWindowThreshold));
REXP distanceSimilarityValue;
distanceSimilarityValue = rc.eval("generateSimilarityScore(referenceJMzString,referenceJIntString,consensusIMzString,consensusIIntString,commonMassWindowThreshold)");
System.out.println("***" + distanceSimilarityValue);
distance = Float.parseFloat(distanceSimilarityValue.asString());
System.out.println("Distance value: " + distance);
} catch (RserveException e) {
e.printStackTrace();
} catch (REngineException e) {
e.printStackTrace();
} catch (REXPMismatchException e) {
e.printStackTrace();
}
这里是 R 函数 generateSimilarityScore,它接受这些值并调用 SpectrumSimilarity 函数。这个函数应该返回一个浮点值。
## define generateSimilarityScore function
generateSimilarityScore<-function(experimentalSpectrumMz, experimentalSpectrumInt, referenceSpectrumMz, referenceSpectrumInt, commonMassThreshold)
{
library(OrgMassSpecR)
# Convert experimentalSpectrumMz to numeric dataframe
experimentalSpectrumMz <- as.data.frame(sapply(experimentalSpectrumMz, as.numeric))
# Convert experimentalSpectrumInt to numeric dataframe
experimentalSpectrumInt <- as.data.frame(sapply(experimentalSpectrumInt, as.numeric))
# Merge experimentalSpectrumMz and experimentalSpectrumInt columnwise in a single data frame
experimentalSpectrum <- cbind(experimentalSpectrumMz, experimentalSpectrumInt)
experimentalSpectrum <- as.data.frame(experimentalSpectrum)
# Convert referenceSpectrumMz to numeric dataframe
referenceSpectrumMz <- as.data.frame(sapply(referenceSpectrumMz, as.numeric))
# Convert referenceSpectrumInt to numeric dataframe
referenceSpectrumInt <- as.data.frame(sapply(referenceSpectrumInt, as.numeric))
# Merge referenceSpectrumMz and referenceSpectrumInt columnwise in a single data frame
referenceSpectrum <- cbind(referenceSpectrumMz, referenceSpectrumInt)
referenceSpectrum <- as.data.frame(referenceSpectrum)
# Covert commonMassThreshold as numeric
commonMassThreshold <- as.numeric(commonMassThreshold)
# Call the SpectrumSimilarity function which should store a numeric value in similarityScoreValue
similarityScoreValue <- SpectrumSimilarity(experimentalSpectrum, referenceSpectrum, t = commonMassThreshold, b=1, top.label = "df1", bottom.label = "df2")
return(similarityScoreValue)
}
SpectrumSimilarity 方法在控制台上打印一个包含结果和单个距离值的表格,当在 R 中独立访问时,但是通过 Java 访问时不会生成/返回距离值(但表格显示在控制台,表示该功能正在运行)。有人可以帮我找出为什么不返回距离值吗?我完全被困在这里了。
【问题讨论】:
-
没有人可以运行上面的代码,因为它不完整 - 你必须至少发布完整的结果输出 - 最好在
return()之前添加str(similarityScoreValue)并发布输出我们可以看到实际返回的内容。
标签: java r dataframe return-value rserve