У меня есть следующая функция для чтения csv (с 18000 строк и 21 столбца) и отображения его содержимого в java-консоли.
public void rFun() {
Rsession instance = RConnect.getInstance();
instance.eval("load(\".RData\")");
instance.eval("g <- read.csv(\"Book2.csv\")");
REXP x = instance.eval("hh <- head(g,2)");
REXP x1 = instance.eval("nrow(hh)");
REXP x2 = instance.eval("ncol(hh)");
try {
int i = 0;
for(int j=0; j<x1.asInteger(); j++){
for(int k=0; k<x2.asInteger(); k++){
System.out.println("Element ["+(j+1)+"]["+(k+1)+"] = "+x.asStrings()[i]);
i++;
}
}
} catch (REXPMismatchException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Но когда я выполняю эту функцию, я получаю это исключение: пытаюсь получить доступ к org.rosuda.REngine.REXPGenericVector как String. Этот фрагмент кода работает, если я создаю фрейм данных, как показано ниже:
instance.eval("xyz <- matrix(c(10,20,3,\"A\",40,50,60),nrow=2)");
REXP x = instance.eval("df <- as.data.frame(xyz)");
Я попытался преобразовать тип данных каждого столбца в символ, а затем получить значение, но при этом генерируется одно и то же исключение. Пожалуйста помоги.
Используйте следующий синтаксис:
for(int i=1; i<=x1.asInteger(); i++){
for(int j=1; j<=x2.asInteger(); j++){
REXP cls1 = instance.eval("c1 <- h["+i+","+j+"]");
System.out.println(cls1.asString());
}
}
Не нужно преобразовывать тип данных в символ. Надеюсь, поможет.