ошибка пакета rjava jcall в R

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

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

person Bylon    schedule 10.12.2013    source источник
comment
пожалуйста, взгляните на stackoverflow.com/ вопросов/18656732/ Я думаю, проблема в том, что main - это статический метод, который следует вызывать не для ссылки на объект, а для самого класса. См. также документацию по rJava для J.   -  person Beasterfield    schedule 10.12.2013
comment
Спасибо, Бистерфилд! Благодарю за вашу помощь!   -  person Bylon    schedule 10.12.2013
comment
Все еще в замешательстве. Так что мне делать? изменить функцию или просто изменить параметры?   -  person Bylon    schedule 10.12.2013


Ответы (1)


Есть две проблемы. На стороне 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 возвращаемого типа, правильный вызов будет быть

J("com.mingdong.rcalljava.test.StringToNum")$main( "1000" ) # untested
person Beasterfield    schedule 10.12.2013