반응형
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/')
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 생성
C:\Users\사용자계정\Documents\R\win-library\3.4\Rserve\java 디렉터리의 REngine.jar, Rserve.jar 2개의 파일을 libs에 복사한 후 Java Build Path / Libraries
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);
}
}
반응형