【问题标题】:R function not returning a value when accessed using Java使用Java访问时R函数不返回值
【发布时间】: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


【解决方案1】:

尝试将 R 函数保存在 .R 文件中,并使用 R 的 source() 函数从 Java 调用它。在您的代码中,Rserve 无法知道您的函数 generateSimilarityScore() 的详细信息。

【讨论】:

    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2016-05-23
    • 2018-06-08
    相关资源
    最近更新 更多