Функция R не возвращает значение при доступе с помощью Java

76
3

Я использую Rserve для соединения с R из Java. У меня проблема с использованием библиотечной функции в R только тогда, когда я обращаюсь к ней через Java. Вот подробности:

В Java у меня есть четыре массива с float. Они используются в качестве входных данных для функции SpectrumSimilarity в пакете OrgMassSpecR R. Чтобы предоставить эти массивы с плавающей точкой в качестве ввода с использованием 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. Эта функция должна возвращать одно значение float.

## 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 (но таблица отображается в консоли, что означает, что функция работает). Может ли кто-нибудь помочь мне найти, почему значение расстояния не возвращается? Я полностью застрял здесь.

спросил(а) 2021-01-28T00:16:16+03:00 4 месяца, 3 недели назад
1
Решение
90

Попробуйте сохранить функцию R в файле.R и вызвать ее из Java с помощью функции R source(). В вашем коде не существует возможности для Rserve узнать подробности вашей функции generateSimilarityScore().

ответил(а) 2021-01-28T00:16:16+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема