[R] Java와 R 연동

16. Java와 R 연동

 

16.1 Java에서 R을 호출하는 방법

  • rJava
  • JRI
  • Rserve - 설치 방법이 간단하고 웹서버에서도 사용가능

 

 

16.2 Rserve 설치 방법

16.2.1 RGui(R console)를 실행한 후 Rserve 패키지 설치(RStudio에서도 실행 가능)

install.packages('Rserve',,'http://www.rforge.net/')

CRAN 저장소를 선택하는 메뉴에서 국내 저장소 선택

 

16.2.2 RGui에서 아래 코드를 먼저 실행한 후 자바 코드에서 호출 가능함

library(Rserve)
Rserve(FALSE, port = 6311, args = '--RS-encoding utf8 --no-save --slave --encoding utf8 --internet2')
Rserve(args = "--RS- encoding utf8")

 

16.2.3 Java Project 생성

Java Project 생성 시 모듈은 Don't Create

 

libs 디렉터리 추가

 

C:\Users\사용자계정\Documents\R\win-library\3.4\Rserve\java 디렉터리의 REngine.jar, Rserve.jar 2개의 파일을 libs에 복사한 후 Java Build Path / Libraries

[Java Build Path] - [Add JARs...] - REngine.jar, Rserve.jar 파일 추가

 

 

16.3 Examples

16.3.1 Ex01_version.java

import org.rosuda.REngine.REXP;
import org.rosuda.REngine.Rserve.RConnection;

public class Ex01_version {
    public static void main(String[] args) {
        // R에 접속하는 객체
        RConnection conn = null;

        try {
            conn = new RConnection();

            // R 명령어를 실행하는 객체
            REXP exp = conn.eval("R.version.string");

            // R의 결괏값을 문자열로 변환
            System.out.println(exp.asString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                conn.close();
            }
        }
    }
}

 

16.3.2 Ex02_return.java

import org.rosuda.REngine.Rserve.RConnection;

public class Ex02_return {
    public static void main(String[] args) throws Exception {
        RConnection conn = new RConnection();

        // R에서 생성한 랜덤값을 리턴 받아 출력
        double d[] = conn.eval("rnorm(10)").asDoubles();
        for (double dd : d) {
            System.out.println(dd);
        }
    }
}

 

16.3.3 Ex03_mean.java

import org.rosuda.REngine.Rserve.RConnection;

public class Ex03_mean {
    public static void main(String[] args) throws Exception {
        RConnection conn = new RConnection();       // R에 접속

        String vector = "c(1, 2, 3, 4)";
        conn.eval("val = mean(" + vector + ")");    // R 명령어가 실행됨
        double mean = conn.eval("val").asDouble();  // 출력값을 변수로 받아옴
        System.out.println("벡터의 평균값: " + mean);
    }
}

 

16.3.4 MyScript.r

myAdd = function(x, y) {
    sum = x + y
    return(sum)
}

 

16.3.5 Ex04_script.java

import org.rosuda.REngine.Rserve.RConnection;

public class Ex04_script {
    public static void main(String[] args) throws Exception {
        RConnection conn = new RConnection();   // R에 접속

        // 미리 저장된 R 스크립트 실행
        // source('R스크립트경로')
        // 역슬래시 4개 또는 슬래시 1개
        // conn.eval("source('D:\\\\work\\\\R\\\\MyScript.r')");
        conn.eval("source('D:/work/R/MyScript.r')");

        int num1 = 10;
        int num2 = 20;

        // 리턴된 값을 정수로 변환
        int sum = conn.eval("myAdd(" + num1 + "," + num2 + ")").asInteger();
        System.out.println("합계: " + sum);
    }
}

 

16.3.6 Ex05_input.java

import org.rosuda.REngine.Rserve.RConnection;

public class Ex05_input {
    public static void main(String[] args) throws Exception {
        RConnection conn = new RConnection();

        double[] x = { 1.5, 2.5, 3.3, 4.2, 5.1 };
        double[] y = { 11, 22, 33, 44, 55 };

        // R 변수에 값을 전달
        // assign("R 변수", 전달할 값);
        conn.assign("x", x);
        conn.assign("y", y);

        // R에서 출력된 결괏값을 숫자 배열로 리턴
        double[] d = conn.eval("x + y").asDoubles();
        for (int i = 0; i < d.length; i++) {
            System.out.println(d[i] + "\t");
        }
    }
}

 

16.3.7 Ex06_list.java

import org.rosuda.REngine.RList;
import org.rosuda.REngine.Rserve.RConnection;

public class Ex06_list {
    public static void main(String[] args) throws Exception {
        double[] dataX = { 1, 2, 3, 4, 5 };
        double[] dataY = { 10, 20, 30, 40, 50 };

        RConnection conn = new RConnection();

        // R 변수에 값을 전달
        conn.assign("x", dataX);
        conn.assign("y", dataY);

        // R의 계산 결과를 리스트로 리턴 받음
        RList list = conn.eval("list(x + y)").asList();

        // 리스트의 첫 번째 요소를 double 배열로 리턴
        double[] numbers = list.at(0).asDoubles();
        for (double num : numbers) {
            System.out.println(num);
        }
    }
}

 

16.3.8 IPython Notebook에서 로지스틱 회귀분석 실습

install.packages("mlbench")

# 랜덤 시드 고정
set.seed(1234)

# 입력값
myvalues <- c(1.0, 1.5, 2.2, 0.5, 0.9, 1.12)

# 라이브러리 로딩
library(MASS)
library(mlbench)

# 데이터 선택
# Sonar
data(Sonar)

# 행의 개수(208건)
n <- nrow(Sonar)

# 전체 데이터의 2/3 선택 => 학습용 : 검증용 = 1 : 1
idt <- sample(1:n, 2 * n / 3, replace = FALSE)

str(idt) # 138건

Sonar.tr <- Sonar[idt,]     # 학습용 데이터셋
Sonar.te <- Sonar[-idt,]    # 검증용 데이터셋

# 다항 로지스틱 회귀분석 모델 생성
fit2 <- glm(Class ~ ., Sonar.tr, family = binomial)

# 예측값을 0~1 사이로 설정
prob <- predict(fit2, Sonar.te, type = 'response')

# 0.5보다 크면 R, 아니면 M
p.class <- ifelse(prob > 0.5, 'R', 'M')

# 에러율 출력
rate <- mean(Sonar.te$Class != p.class)
rate

 

16.3.9 Ex07_logit.java

import org.rosuda.REngine.REXP;
import org.rosuda.REngine.Rserve.RConnection;

public class Ex07_logit {
    public static void main(String[] args) throws Exception {
        RConnection conn = new RConnection();

        // voidEval(): 리턴 값이 없는 R 코드 실행
        conn.voidEval("set.seed(1234)");
        conn.voidEval("library(MASS)");
        conn.voidEval("library(mlbench)");
        conn.voidEval("data(Sonar)");
        conn.voidEval("n <- nrow(Sonar)");
        conn.voidEval("idt <- sample(1:n, 2 * n / 3, replace = FALSE)");
        conn.voidEval("Sonar.tr <- Sonar[idt,]");
        conn.voidEval("Sonar.te <- Sonar[-idt,]");
        conn.voidEval("fit2 <- glm(Class ~ ., Sonar.tr, family = binomial)");
        conn.voidEval("prob <- predict(fit2, Sonar.te, type = 'response')");
        conn.voidEval("p.class <- ifelse(prob > 0.5, 'R', 'M')");
        conn.voidEval("rate <- mean(Sonar.te$Class != p.class)");

        REXP x = conn.eval("rate");
        System.out.println("에러율: " + x.asDouble() * 100 + "%");
    }
}

 

16.3.10 Sonar.r

sonar <- function() {
    set.seed(1234)
    myvalues <- c(1.0, 1.5, 2.2, 0.5, 0.9, 1.12)
    library(MASS)
    library(mlbench)
    data(Sonar)
    n <- nrow(Sonar)
    idt <- sample(1:n, 2 * n / 3, replace = FALSE)
    Sonar.tr <- Sonar[idt,]
    Sonar.te <- Sonar[-idt,]
    fit2 <- glm(Class ~ ., Sonar.tr, family = binomial)
    prob <- predict(fit2, Sonar.te, type = 'response')
    p.class <- ifelse(prob > 0.5, 'R', 'M')
    rate <- mean(Sonar.te$Class != p.class)
    return(rate)
}

 

16.3.11 Ex08_sonar.java

import org.rosuda.REngine.Rserve.RConnection;

public class Ex08_sonar {
    public static void main(String[] args) throws Exception {
        RConnection conn = new RConnection();
        conn.eval("source('D:/work/analysis/R/Sonar.r')");
        double rate = conn.eval("sonar()").asDouble();
        System.out.println("에러율: " + rate);
    }
}

'programming > r' 카테고리의 다른 글

[R] Java와 R 연동  (0) 2020.08.25
[R] SVM(Support Vector Machines)  (0) 2020.06.03
[R] 인공신경망  (0) 2019.09.30
[R] 요인분석, 주성분분석  (0) 2018.12.29
[R] 로지스틱 회귀분석  (0) 2018.12.25
[R] 상관 분석과 회귀 분석  (0) 2018.12.22

댓글(0)

Designed by JB FACTORY