Преобразование объекта REXP в двойной массив (Java / R) - PullRequest
4 голосов
/ 19 сентября 2011

Я хочу, чтобы R генерировал, например, обычные данные, а затем использовал эти данные в Java.Я знаю, что есть функция для преобразования объекта REXP в массив, но, похоже, она не работает.Вот что у меня есть:

REXP x;
x = re.eval("rnorm(100,50,10)");
double[] test = x.asDoubleArray();
System.out.println(x);
System.out.println(test);

Я распечатал оба, чтобы увидеть, что не так.Результаты следующие:

[REAL* (61.739814266023316, 40.25177570831545, 36.09450830843867, 48.06821029847672,...etc)]
[D@61de33

Проблема в том, как R возвращает результаты в Java;он сообщает java, что такое x, если бы они были строками, он бы сказал [String * (.. что угодно ..)].Я просто хочу, что в скобках.Также строка, которую он возвращает, является строкой независимо.

Я буду работать с большими данными, поэтому хочу, чтобы они были быстрыми.Я пытался использовать подмножества, извлекая то, что находится в скобках, а затем анализируя их в двойные числа, но должно быть лучшее решение.Кроме того, это не работает для данных с более чем 100 баллами.

1 Ответ

1 голос
/ 06 ноября 2011

Поскольку уже есть ссылка на этот вопрос, давайте ответим:

System.out.println(test);, где test равно double[] буквально означает System.out.println(test.toString());

Проблема в том,в Java массивы имеют очень плохую реализацию toString().Следовательно, чтобы получить нужный вам результат, вы должны использовать

REXP x;
x = re.eval("rnorm(100,50,10)");
double[] test = x.asDoubleArray();
System.out.println(x);
System.out.println(Arrays.asList(test)); // note we get an array-backed list here

, поскольку списки имеют правильный метод toString().

Опять же, мои извинения за очевидный ответ.

...