0
我使用Rserve
從Java內部與R進行連接。只有當我通過Java訪問它時,我纔有在R中使用庫函數的問題。這裏是細節:R函數在使用Java訪問時不返回值
在Java中我有四個float
陣列。這些用作R的OrgMassSpecR
包中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)
}
當R獨立地訪問,但是不生成任何距離值/通過Java訪問(但顯示錶時返回的SpectrumSimilarity
方法打印的結果和單個距離值的表,控制檯,上在控制檯中,意味着該功能正在工作)。有人可以幫我找到距離值不返回的原因嗎?我完全陷在這裏。
沒有人可以運行上面的代碼,因爲它是不完整的 - 您必須至少發佈完整的結果輸出 - 並且理想地在'return()'之前添加'str(similarityScoreValue)'並且將輸出我們可以看到實際返回的內容。 –