Search

[R] package :: xaringan [coming soon]

Properties
R package
Author
Empty
Date
Empty
Link
Empty
Created
5/7/2021, 11:36:00 AM
Tags
Programming
C++
links
Empty

Cpp을 써야하는 이유?

프로그래밍 언어란 결국에는 compiler에 의한 "compile"이라는 과정을 통해서 0과 1로 구성된 컴퓨터 언어로 변환이 되어서 구동이 되는데, 이 때 프로그래밍 언어가 native 컴퓨터 언어에 얼마나 가까운지에 따라 high / low로 나뉩니다. Low-level language : Assembly, C, C++, Fortran High-level language : Java, Python, R
Low-level language는 사용하기는 어렵지만 native 언어와 비슷하기 때문에 그만큼 속도도 빠릅니다. High-level language는 low-level language의 불편함을 해소하기 위해서 사용하기에 매우 편리하지만, 대신에 빠른 속도를 잃었습니다.
데이터 분석 분야에서는 빠른 속도 뿐만 아니라 간편한 조작 및 인터페이스를 모두 얻기 위해서 (1) 계산이 많이 필요한 핵심 파트에서는 low-level language, (2) 이외에는 high-level language 를 사용하는 방식을 채택하고 있습니다.
그에 따라 R programming language에서도 Rcpp, rJava, rPython, V8 등과 같은 다른 언어를 이용 가능하도록 해주는 패키지들이 많이 등장했습니다.

R에서 Cpp 사용하기

기본적으로 .Call()를 사용하면 C 또는 Fortran 함수를 호출할 수 있습니다. 그러나, 추천드리지 않습니다.
최근에는 Rcpp 패키지의 등장으로 인해 업데이트가 잘 이루어지지 않는 Fortran보다는 RCpp을 많이 이용하고 있는 추세입니다.

기본 규칙

C++을 사용하기 전 아주 간단한 기본 규칙
1. C++에서는 각 구문 (statement)이 끝날때마다 세미콜론 ;을 붙여야합니다. 2. 변수의 타입은 사전에 정의되어야합니다. 3. 각 함수 (function)는 반드시 return 구문으로 마무리되어야합니다. 4. Assignment에는 <- 대신 =를 사용하십시오. 5. 주석처리 (comment)할 떄에는 // text 또는 /* text */ 를 사용하시면 됩니다.

함수 만들기 및 R에서 불러오기

두 숫자를 더하는 함수 add를 만들어 봅시다.
R versus C++
add_r = function(x, y) x + y
R
double add_cpp(double x, double y) { double value = x + y; return value; }
R
Rcpp을 이용한다면,
library("Rcpp") cppFunction(' double add_cpp(double x, double y) { double value = x + y; return value; } ') add_cpp( 1, 2 ) # [1] 3
R
cppFunction 함수를 이용하면 싱글 C++ 함수를 손쉽게 이용할 수 있습니다.
만약 이미 작성된 C++ 코드 파일을 불러오기 위해서는 sourceCpp()을 이용하면 됩니다.
sourceCpp("path/to/file.cpp")
R
이 때 반드시 C++ 파일의 헤더 부분에는 #include Rcpp.h를 포함해야합니다. Rcpp.h에는 Rcpp에서 제공하는 클래스, 함수 등이 저장되어 있기 때문입니다. Rcpp.h는 Rcpp이 설치된 곳에 있습니다.
<file.cpp 파일> #include <Rcpp.h> ... ...
C++
그럼 이제 Rcpp.h를 통해 Rcpp에서 제공하는 함수를 사용할 수 있게 되었는데, 이 함수들을 사용하기 위해서는 Rcpp::function_1과 같이 해주면 됩니다. 이 때, Rcpp::을 적는게 너무 번거롭다면, 아래와 같이 "using namespace"를 지정해주면 됩니다.
using namespace Rcpp;
C++
그리고 우리가 R로 불러오길 원하는 C++ 함수는 다음과 같이 "export"해줘야합니다.
// [[Rcpp::export]]
C++
이를 종합하면 다음과 같습니다.
library(Rcpp) sourceCpp("path/to/file.cpp") add_cpp( 1, 2 ) # [1] 3
R
#include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] double add_cpp(double x, double y) { double value = x + y; return value; }
C++

벡터 클래스 및 반복문 사용하기

C++ with Syntactic Sugar

TOP