Как экспортировать данные из R-скрипта в Java с помощью Rserve?
Я использую Rserve для доступа к R-скрипту через мой Java-проект. Java-код запрашивает пользовательский ввод для ввода местоположения файла и сохраняет в переменной String. Затем эта переменная передается в функцию R, которая должна прочитать местоположение файла, выполнить некоторые процессы, а затем создать новую папку и записать обработанные данные в отдельные файлы, а затем распечатать на консоли, что все файлы были сгенерированы. Первоначально я проверил R-соединение с уменьшенной версией программы, и это сработало. Но когда я включаю шаги для записи данных в файлы, он показывает следующую ошибку: Введите путь к файлу:
/home/workspace/TestR/test_file
Exception in thread "main" org.rosuda.REngine.Rserve.RserveException: eval failed, request status: error code: 127
at org.rosuda.REngine.Rserve.RConnection.eval(RConnection.java:234)
at testMain.main(testMain.java:23)
Кроме того, код также не печатает никаких операторов на консоли, которые должны быть напечатаны через R из Rscript. Вот код Java:
import java.util.Scanner;
import org.rosuda.REngine.REXP;
import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.REngineException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
public class testMain {
static String dirPath;
public static void main(String[] args) throws REXPMismatchException, REngineException {
// For user input
Scanner scanner = new Scanner(System.in );
System.out.println("Enter the file path: ");
dirPath = scanner.nextLine();
RConnection c = new RConnection();
// source the Palindrome function
c.eval("source('/home/workspace/TestR/Main.R')");
REXP valueReturned = c.eval("Main(\""+dirPath+"\")");
//c.eval("Main(\""+dirPath+"\")");
System.out.println(valueReturned.length());
}
}
И вот сценарий R:
Main <- function(FILE_PATH)
{
## load libraries
library(MALDIquant)
library(MALDIquantForeign)
library(dcemriS4)
require(gridExtra) # also loads grid
library(lattice)
library(fields)
library(matlab)
library(rJava)
#Call the source files of the function which this script will use
source('/home/workspace/TestR/importAnalyzeFormat.R', echo=TRUE)
source('/home/workspace/TestR/exportFile.R', echo=TRUE)
source('/home/workspace/TestR/readRecalibratedSpectra.R', echo=TRUE)
spectralDataObjects <- importAnalyzeFormat(FILE_PATH)
p <- detectPeaks(spectralDataObjects, method="MAD", halfWindowSize=1, SNR=1)
# Assign the p to preprocessedDataObjects
preprocessedDataObjects<-p
dir.create("PreprocessedSpectra", showWarnings = FALSE)
setwd("PreprocessedSpectra")
for(i in 1:length(preprocessedDataObjects))
{
coordinateValue<-metaData(preprocessedDataObjects[[i]])
coordinates<-coordinateValue$imaging$pos
mzValues<-mass(preprocessedDataObjects[[i]])
intensityValues<-intensity(preprocessedDataObjects[[i]])
exportFile(coordinates,mzValues,intensityValues)
}
print("Files exported. Program will now terminate")
print("############################################################")
return(preprocessedDataObjects)
}
Может кто-нибудь, пожалуйста, помогите мне?
2 ответа
У вас есть ошибка в вашем скрипте, 127 означает, что есть исключение разбора.
Если вы используете что-то подобное, это выведет ошибку в сценарий.
с является резервным соединением в этом случае.
c.assign(".tmp.", myCode);
REXP r = c.parseAndEval("try(eval(parse(text=.tmp.)),silent=TRUE)");
if (r.inherits("try-error")) System.err.println("Error: "+r.toString())
else { // success .. }
Код ошибки 127 означает исключение при разборе.
Измените свою линию:
c.eval("источник ('/ дом / рабочее пространство /TestR/Main.R')");
в
c.eval("источник (\"/ дом / рабочее пространство /TestR/Main.R\")");
Теперь это должно работать.