2016-10-26 4 views
1

Я извлекаю значения из R-скрипта (используя библиотеку Renjin), а затем пытаюсь манипулировать ими в java. R сценарий возвращает ListVector, который выглядит как:Итерация через вектор в java

c(1L, 2L, 3L, 4L, 5L...10 elements total) 
c(0.70836348202446, 3.27419352963856, 4.08477502998281, 4.11959291310495, 4.64797692435211,... 10 elements total) 
c(10.88276411602949, 11.01414766445697, 14.22416580313999, 14.40880862158516, 15.64782262321588,... 10 elements total) 

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

Для этого я делаю

ListVector exp = (ListVector) engine.eval(new java.io.FileReader("/Users/sebastianzeki/Desktop/script.R")); 
     java.util.Iterator<SEXP> itr = exp.iterator(); 
     System.out.println("Iterating through Vector elements...");  

       while(itr.hasNext()){ 
        java.util.Vector<SEXP> v=new Vector<SEXP>(); 
        v.add(itr.next()); 
        java.util.Iterator<SEXP> itr2 = v.iterator(); 

        while(itr2.hasNext()){ 
        System.out.println("My Elements"+itr2.next()); 
             } 
            } 

Однако это просто печатает каждый из векторов в отдельности, так что я в конечном итоге с

My Elementsc(1L, 2L, 3L, 4L, 5L...10 elements total) 
    My Elementsc(0.70836348202446, 3.27419352963856, 4.08477502998281, 4.11959291310495, 4.64797692435211,... 10 elements total) 
    My Elementsc(10.88276411602949, 11.01414766445697, 14.22416580313999, 14.40880862158516, 15.64782262321588,... 10 elements total) 
+1

Что библиотеки вы используете? Какой тип 'engine',' ListVector', 'Vector'? –

+2

Похоже, у вас есть один вектор, содержащий три элемента, каждый из которых сам по себе является вектором. Вы повторяете эти три элемента. Если вы хотите перебрать элементы этих трех векторов, вам понадобится второй цикл внутри первого. –

+1

А что такое 'SEXP'? Это то, что вы печатаете здесь. –

ответ

0

Вы вызываете «ToString()», который обеспечивает вывод отладки, но обычно не печатает всего содержимого вектора.

Вы получаете доступ к отдельным элементам векторов, вызвав getElementAsObject(i) или типизированных getElementAsDouble(i) методы доступа:

for(SEXP element in exp) { 
    Vector elementVector = (Vector)element; // if you're sure this will be a vector 
    for(int i=0;i<elementVector.length();++i) { 
    System.out.println("[" + i + "] = " + elementVector.getElementAsDouble(i)); 
    } 
} 

Вы можете найти более подробную документацию по этому API на docs.renjin.org

Смежные вопросы