• 机器学习
  • Java调用R apriori 算法结果传递出现问题

Java 调用R的 挖掘结果问题。

R:代码:

a<-rpart(Species~.,iris)"

a

显示结果:

n= 150

node), split, n, loss, yval, (yprob)

* denotes terminal node

1) root 150 100 setosa (0.33333333 0.33333333 0.33333333)

2) Petal.Length< 2.45 50 0 setosa (1.00000000 0.00000000 0.00000000) *

3) Petal.Length>=2.45 100 50 versicolor (0.00000000 0.50000000 0.50000000)

6) Petal.Width< 1.75 54 5 versicolor (0.00000000 0.90740741 0.09259259) *

7) Petal.Width>=1.75 46 1 virginica (0.00000000 0.02173913 0.97826087) *

java调用这个R 用这个包 代码:

r.eval("library(rpart)");

r.eval("a<-rpart(Species~.,iris)");

REXP trees=r.eval("a");

REXP no1=r.eval("labels(a)");

System.out.println(trees);

System.out.println(no1);

结果:

[VECTOR ([VECTOR ([FACTOR {levels=("<leaf>","Petal.Length","Petal.Width"),ids=(1,0,2,0,0)}], [INT* (150, 50, 100, 54, 46)], [REAL* (150.0, 50.0, 100.0, 54.0, 46.0)], [REAL* (100.0, 0.0, 50.0, 5.0, 1.0)], [REAL* (1.0, 1.0, 2.0, 2.0, 3.0)], [REAL* (0.5, 0.01, 0.44, 0.0, 0.01)], [INT* (3, 0, 3, 0, 0)], [INT* (3, 0, 3, 0, 0)], [REAL* (1.0, 1.0, 2.0, 2.0, 3.0, 50.0, 50.0, 0.0, 0.0, 0.0, 50.0, 0.0, 50.0, 49.0, 1.0, 50.0, 0.0, 50.0, 5.0, 45.0, 0.3333333333333333, 1.0, 0.0, 0.0, 0.0, 0.3333333333333333, 0.0, 0.5, 0.9074074074074074, 0.021739130434782608, 0.3333333333333333, 0.0, 0.5, 0.0925925925925926, 0.9782608695652174, 1.0, 0.3333333333333333, 0.6666666666666666, 0.36, 0.30666666666666664)])], [INT* (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, ... (50 more values follow))], [NULL ], [NULL ], [REAL* (0.5, 0.44, 0.01, 0.0, 1.0, 2.0, 1.0, 0.5, 0.06, 1.21, 0.8200000000000001, 0.11, 0.04836665518033404, 0.060969937947592937, 0.03192700006786314)], [STRING "class"], [VECTOR ([REAL* (0.3333333333333333, 0.3333333333333333, 0.3333333333333333)], [REAL* (0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0)], [REAL* (1.0)])], [VECTOR ([INT* (20)], [REAL* (7.0)], [REAL* (0.01)], [INT* (4)], [INT* (5)], [INT* (2)], [INT* (0)], [INT* (30)], [INT* (10)])], [VECTOR ([NULL ], [NULL ], [NULL ])], [INT* (5)], [REAL* (150.0, 150.0, 150.0, 150.0, 0.0, 0.0, 0.0, 100.0, 100.0, 100.0, 100.0, 0.0, 0.0, 0.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 50.0, 50.0, 34.16405023547881, 19.038507534082754, 1.0, 0.92, 0.8333333333333334, 38.969404186795494, 37.35353535353535, 10.686868686868685, 3.555555555555557, 0.91, 0.73, 0.67, 2.45, 0.8, 5.45, 3.3499999999999996, 0.8, 5.45, 3.3499999999999996, 1.75, 4.75, 6.15, 2.45, 4.75, 6.15, 2.95, 0.0, 0.0, 0.0, 0.0, 1.0, 0.76, 0.5, 0.0, 0.0, 0.0, 0.0, 0.8043478260869565, 0.41304347826086957, 0.2826086956521739)], [REAL* (88.96940418679549, 81.3449555415529, 54.0960582510677, 36.013092487572635)], [INT* (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ... (50 more values follow))], [BOOLi* ])]

我知道结果不一样的原因是 a 在R里面存着是以对象方式存储 他的构成为:

names(a)

[1] "frame" "where" "call"

[4] "terms" "cptable" "method"

[7] "parms" "control" "functions"

[10] "numresp" "splits" "variable.importance"

[13] "y" "ordered"

由这些结果构成a在R中的存储。但是 现在问题时 我如何将a 在R的显示结果 就是这个“树形图“

> a

n= 150

node), split, n, loss, yval, (yprob)

* denotes terminal node

1) root 150 100 setosa (0.33333333 0.33333333 0.33333333)

2) Petal.Length< 2.45 50 0 setosa (1.00000000 0.00000000 0.00000000) *

3) Petal.Length>=2.45 100 50 versicolor (0.00000000 0.50000000 0.50000000)

6) Petal.Width< 1.75 54 5 versicolor (0.00000000 0.90740741 0.09259259) *

7) Petal.Width>=1.75 46 1 virginica (0.00000000 0.02173913 0.97826087) *

传递到Java当中呢?实在找不到办法。使用print(a) 传递过来 ,还是一样,不变。

回复 第1楼 的 Wallee:print是一个泛型函数,打印的是最简洁的结果,而a本身实际上是一个list,所以你直接用print无法得到你想要的结果,捕获打印结果应当使用capture.output函数

如:

<br />
String trees = new String();<br />
trees=c.eval("library(rpart);a <- rpart(Species~.,iris);paste(capture.output(a),collapse='\n')").asString();<br />
System.out.println(trees);<br />
</p>