2015-11-03 54 views
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方法打印的結果和單個距離值的表,控制檯,上在控制檯中,意味着該功能正在工作)。有人可以幫我找到距離值不返回的原因嗎?我完全陷在這裏。

+0

沒有人可以運行上面的代碼,因爲它是不完整的 - 您必須至少發佈完整的結果輸出 - 並且理想地在'return()'之前添加'str(similarityScoreValue)'並且將輸出我們可以看到實際返回的內容。 –

回答

0

嘗試將R函數保存到.R文件中,並使用R的source()函數從Java中調用它。在你的代碼中,Rserve無法知道你的函數generateSimilarityScore()的細節。