2015-01-19 2 views
3

R 데이터를 사용하여 R 레벨에서 C로 작성된 함수를 어떻게 사용할 수 있습니까? 예. 맥락에서R에서 C 함수를 호출하는 방법?

double* addOneToVector(int n, const double* vector) { 
    double* ans = malloc(sizeof(double)*n); 
    for (int i = 0; i < n; ++i) 
     ans[i] = vector[i] + 1 
    return ans; 
} 

: 같은 기능을 사용

x = 1:3 
x = addOneToVector(x) 
x # 2, 3, 4 

답변

4

내가 먼저 유래를 검색 한하지만 난 여기에 그것에 대해 아무 대답이없는났습니다.
는 일반적인 생각은 (리눅스에 대한 명령하지만, 다른 OS에서 같은 생각)입니다 :

  1. 기본적인 유형에 대한 포인터를 가지고 부작용 (무효 반환)에 의해 모든 것을 할 것입니다 함수를 만듭니다. 예 :

    dyn.load("foo.so") 
    
  2. 전화 : R에서

    $ R CMD SHLIB lib.c 
    
  3. 로드 동적 라이브러리 :

    void addOneToVector(int* n, double* vector) { 
        for (int i = 0; i < *n; ++i) 
         vector[i] += 1.0; 
    } 
    
  4. 컴파일 파일 C 소스로 동적 라이브러리, 당신은이 작업을 수행하기 위해 R 바로 가기를 사용할 수 있습니다 C 함수는 .C R 함수를 사용하여 함수, IE :

    x = 1:3 
    ret_val = .C("addOneToVector", n=length(x), vector=as.double(x)) 
    

함수를 호출 한 후 입력 값을 얻을 수있는 목록을 반환합니다.

ret_val$x # 2, 3, 4 

이제 R에서 쉽게 사용할 수 있도록 포장 할 수 있습니다.

(또한 포트란 커버) 여기에서 자세한 내용과 전체 프로세스를 설명하는 좋은 페이지가있다 :

이 컨텍스트에 편리한 "인라인"또한,이다

http://users.stat.umn.edu/~geyer/rc/

+0

패키지,'addOne = 인라인 :: cfunction (int i = 0; i <* n; ++ i) vector [i] + = 1.0; ', convention = "(sig = c (n ="정수 ", 벡터 ="숫자 " .C ")'그리고 나서'addOne (length (x), as.double (x)) $ vector'를 호출한다. –

관련 문제