2013-04-15 43 views
1

我想从一个叫做kruskalmc的方法获得结果。JRI REXP布尔值

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。

回答

1

我还没有使用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那里得到,或者只是像原来一样使用它们。

不是一个理想的解决方案,所以我希望有人提出更好的东西。

+0

谢谢。这对我的问题很好。 – bladepit

+0

如果你使用'REngine' API,那么就有'public boolean [] isFALSE()'和'public boolean [] isTRUE()'。由于显而易见的原因,从R逻辑到布尔逻辑的转换是有损的,所以你必须声明你想如何处理“NA”。使用'asIntArray()'的低级JRI API确实是最好的方法,并根据int值决定要做什么。 –

1

据我所见,问题是从R导出到java时的类型转换。查看JRI的部分documentation

当前支持的对象是字符串,整数和数字向量。

举重复的例子(从功能上自己的文档):

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你会希望将其转换回布尔值,或任何最终你正在使用的形式。

+1

也能正常工作。谢谢 – bladepit

0

电话:

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?