2013-12-10 2 views
0

Я хочу использовать R для ввода параметра в Java, например «1000». Затем метод StringToNum обрабатывает и выводит его возврат в R, а именно 1000. Кажется, это работа .jcall(), но я не знаю, как это сделать с его параметрами. Поскольку я не знаю Java, не могли бы вы мне помочь? Большое спасибо!package rjava jcall error in R

Java код

package com.mingdong.rcalljava.test; 

import java.io.PrintStream; 

public class StringToNum 
{ 
private String inputString = null; 

public StringToNum(String inputString) 
{ 
    this.inputString = inputString; 
} 

public StringToNum() 
{ 
} 

public int convertStringToInt() 
{ 
    if (this.inputString == null) { 
    this.inputString = "100"; 
    } 
    return Integer.valueOf(this.inputString).intValue(); 
} 

public static void main(String[] args) 
    { 
    StringToNum stringToNum = new StringToNum(); 
    int num = stringToNum.convertStringToInt(); 
    System.out.println("num:" + num); 
    } 
} 

R код

library(rJava) 
.jinit() 
.jinit('D:/Eclipse/dailyjob/javaProject/TestRCallJava.jar') 

## .jaddClassPath("D:\\Eclipse\\dailyjob\\javaProject\\TestRCallJava.jar") 

inputString <- .jnew("java.lang.String","1000") 
inputString %instanceof% "java.lang.String" 

StringToNum <- .jnew("com.mingdong.rcalljava.test.StringToNum") 
StringToNum %instanceof% "com.mingdong.rcalljava.test.StringToNum" 

.jcall(StringToNum,returnSig= "V", "main",inputString) 
Error in .jcall(StringToNum, returnSig = "V", "main") : 
method main with signature()V not found 
+0

пожалуйста, посмотрите на http://stackoverflow.com/questions/18656732/rjava-jcall-return-type-issue/18656827#18656827 я думаю, что проблема заключается в том, что 'main' является статическим методом, который не следует вызывать в ссылке на объект, а сам класс. См. Также документацию rJava для 'J'. – Beasterfield

+0

Спасибо, Бистерфилд! Цените свою помощь! – Bylon

+0

Все еще запутался. Так что мне делать? изменить функцию или просто изменить параметры? – Bylon

ответ

0

Есть два вопроса. На стороне Java в main вы вызываете конструктор new StringToNum(), который не существует. Основной метод должен выглядеть следующим образом:

public static void main(String[] args) { 
    StringToNum stringToNum = new StringToNum(args[0]); 
    int num = stringToNum.convertStringToInt(); 
    System.out.println("num:" + num); 
} 

Возможно, это решает уже вашу проблему. Однако, как правило, вы вызываете статические методы в Java не на объекте, а на классе. Если вы хотите вызвать метод main от Java вы должны были бы назвать

StringToNum.main("1000"); 

вместо вызова

StringToNum obj = new StringToNum(""); 
obj.main("1000"); 

Вы должны также избегать вызова функций низкого уровня (указывается, начиная с .) пакета rJava. Так как указано в rJava .jcall return type issue правильный вызов будет

J("com.mingdong.rcalljava.test.StringToNum")$main("1000") # untested 
+0

Спасибо большое :) – Bylon

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