Логические значения JRI REXP

Я хочу получить результаты от метода, который называется kruskalmc.

Результаты в консоли R выглядят так:

Multiple comparison test after Kruskal-Wallis 
p.value: 0.05 
Comparisons
      obs.dif critical.dif difference  
1-2    7.65     9.425108      FALSE
1-3   14.40     9.425108       TRUE 
2-3    6.75     9.425108      FALSE

Теперь я хочу получить значения из столбца разницы.

Если я попытаюсь получить его в java с помощью:

REXP res = re.eval("result$dif.com$difference");

Я верну что-то вроде этого: [BOOLi* ]

Как я могу перебирать объект BOOLi в java?

Мне нужны значения FALSE TRUE FALSE.


person bladepit    schedule 15.04.2013    source источник


Ответы (3)


Я мало использовал JRI, но, поскольку никто вам не ответил, я пойду на это.

Я могу ошибаться, но, похоже, нет метода преобразования res в логический массив, хотя есть методы преобразования в int[], double[] и String[]. Вы можете преобразовать свой результат в целые числа следующим образом:

REXP res = re.eval("result$dif.com$difference");
int[] x = res.asIntArray();

for (int i = 0; i < x.length; i++) {
  System.out.println(x[i]);
}

Вы получите обратно 1, представляющее TRUE значений, и 0, представляющее FALSE. Вы можете преобразовать эти числа в логические значения, если хотите, из Java или просто работать с ними как есть.

Не идеальное решение, поэтому я надеюсь, что кто-то придумает что-то лучше.

person Ciarán Tobin    schedule 15.04.2013
comment
Если вы используете REngine API, то есть public boolean[] isFALSE() и public boolean[] isTRUE(). По очевидным причинам преобразования из R-логики в логические значения происходят с потерями, поэтому вам нужно объявить, как вы хотите обрабатывать NA. С низкоуровневым API JRI использование asIntArray() действительно лучший способ решить, что делать на основе значений int. - person Simon Urbanek; 04.03.2015

Насколько я вижу, проблема заключается в преобразовании типов при экспорте из R в java. Просмотр части документации для JRI:

В настоящее время поддерживаются следующие объекты: строки, целочисленные и числовые векторы.

Чтобы привести воспроизводимый пример (из собственной документации функций):

require(pgirmess)
resp <-c(0.44,0.44,0.54,0.32,0.21,0.28,0.7,0.77,0.48,0.64,0.71,0.75,0.8,0.76,0.34,0.80,0.73,0.8)
categ <- as.factor(rep(c("A","B","C"),times=1,each=6))
k1 <- kruskalmc(resp, categ)

Затем мы видим, что is.logical(k1[[3]][,3]) == TRUE:

> str(k1[[3]][,3])
logi [1:3] FALSE TRUE FALSE

в то время как все еще в R самый простой способ, казалось бы, преобразовать это с помощью

> as.numeric(k1[[3]][,3])
[1] 0 1 0

или вы можете отправить его как символ:

> as.character(k1[[3]][,3])
[1] "FALSE" "TRUE"  "FALSE"

Оказавшись в java, вы захотите преобразовать его обратно в логическое значение или в любую окончательную форму, с которой вы работаете.

person dardisco    schedule 15.04.2013

Вызов:

survdiff(formula = model)

                                N Observed Expected (O-E)^2/E (O-E)^2/V
x[, 1]=G1:Vehicle               8        6     2.65      4.22      9.02
x[, 1]=G2:AZ13655037 15mg/kg/qd 8        0     3.35      3.35      9.02

Chisq= 9 на 1 степень свободы, p= 0,00267 Теперь мы хотим получить значения из p. Как я могу получить это в java?

person user4472614    schedule 20.01.2015