AnyLogic simulation как вызвать R-скрипт

#r #anylogic

#r #anylogic

Вопрос:

Мне нужно вызвать R-скрипт из AnyLogic. У меня есть агент ‘sensor’, и он собирается отправить случайный файл из определенного местоположения в R script, а затем R script проанализирует этот файл и сообщит нам тип этого файла (изображение, звук, текст и т.д.)

Пожалуйста, дайте мне знать, как вызвать R-скрипт из AnyLogic..

Комментарии:

1. Я бы сказал, что большинство из нас не знают, что такое anylogic. Можете ли вы запускать системные команды из anylogic? если это так, вы могли бы запустить rscript таким образом. в противном случае, это было бы лучше изложить на форуме anylogic или в их службе поддержки

Ответ №1:

я не уверен, что существует прямой адаптер для AnyLogic и R, но все агенты в AnyLogic являются объектами Java, поэтому вы можете вызывать внешние Java-программы (.jar). JRI — это интерфейс Java / Rhttp://rforge.net/JRI вы можете написать свой R-скрипт в JRI, а затем вызвать из AnyLogic

Ответ №2:

Rcaller — это другой маршрут. Довольно простая и все еще активная разработка:https://code.google.com/p/rcaller /

Ответ №3:

Воскрешая старый вопрос, потому что ни одно из вышеупомянутых решений не было тем, что мне было нужно. Альтернативой, которая не требует внешних интерфейсов, является использование системных команд, как предложил rawr. Это можно сделать с помощью чего-то вроде следующего. Сначала создайте java-класс в AnyLogic с помощью следующего кода (измененного из этого руководства)

 import java.io.*; 
public class SystemUtil {
    public static Process executeCommands(String commands, String directory, String errorFile) {
        Process process = null;
        
        boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("windows");
        
        ProcessBuilder pb;
        if(isWindows) {
            pb = new ProcessBuilder("cmd.exe","/c",commands);
        } else {
            pb = new ProcessBuilder("/bin/sh","-c",commands);
        }
         
        pb.directory(new File(directory)); //Set current directory
        pb.redirectError(new File(errorFile)); //Log errors in specified log file.
        try {
            process = pb.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return process;
    }
}
  

После этого вы сможете вызвать любую системную команду, которую захотите, включая Rscript, используя недавно определенный класс. В качестве игрушечного примера, если вы поместите этот код в кнопку, вы создадите CSV-файл, содержащий диагональную матрицу 3×3. Замените команду соответствующим вызовом Rscript для вашего скрипта.

 String command = "Rscript -e write.csv(diag(3),file='out.csv')";
String dir = System.getProperty("user.dir");
String log = String.format("%s/log.txt",dir);

SystemUtil.executeCommands(command,dir,log);