2012-06-19 4 views
0

는 R 함수 (C++)에 배열 송신 :내가 ++ C이 함수를 작성한

extern "C" 
{ 

    void add(int* first, int* second, int *n , int* sum) 
    { 
     for (int i = 0; i< *n; i++) 
     { 
      sum[i] = first[i] + second[i]; 
     } 


    } 
} 

이 드라이버 :

add <- function(twoColumn) 
{ 
    if(!is.data.frame(twoColumn))stop("twoColumn should be data.frame") 

    first <- twoColumn[1] 
    second <- twoColumn[2] 
    n <- length(first) 
    .C("add",first = as.integer(unlist(first)),second = as.integer(unlist(second)), n = as.integer(n),sum = as.integer(rep(0,n)))$sum 


} 

그러나 R내는 것은 단지 수이고 데이터 프레임의 첫 번째 행의 합계.

+0

아마도 n <- nrow (first)가 도움이됩니까? – Julius

+0

길이 란 무엇입니까? 또한'twoColumn [[1]]'등을 시도하고 unlist를 생략하면'n'은 이미 정수이기 때문에'sum.integer (n)'은 필요 없다. 'rep ... '. –

답변

1

문제점은 무엇인지 모르겠지만 (다소 야심적인) 코드의 작동 버전을 제공 할 수 있습니다. 이 기능을 패키지로 당신을 필요로하며, 다음과 같이 작동

src/add.cpp :

SEXP add(SEXP Rx, SEXP Ry){ 
    SEXP xy_sum; 
    int i; 
    PROTECT(xy_sum = allocVector(REALSXP, 1)); 
    for(i = 0; i < length(Rx); i++){ 
     REAL(xy_sum)[i] = REAL(Rx)[i] + REAL(Ry)[i]; 
    } 
    UNPROTECT(1); 
    return xy_sum; 
} 

scr/add.h :

#ifndef _add_ADD_H 
#define _add_ADD_H 

#include <R.h> 
#include <Rdefines.h> 

extern "C" SEXP add(SEXP Rx, SEXP Ry); 

#endif 

R/add.R :

add <- function(x, y){ 
    if(length(x) != length(y)) stop("Vectors must be of the same length.") 
    # coerce into numeric in case the user supplied something silly 
    .Call("add", PACKAGE="add", as.numeric(x), as.numeric(y)) 
} 

R/zzz.R :

.onLoad <- function(lib, pkg){ 
    library.dynam("add", pkg, lib) 
} 
+0

니스. 또한 인라인 패키지와 cfunction()/cxxfunction()을 사용하여 패키지없이 즉시 수행 할 수 있습니다. 그리고 나서 Rcpp가 있습니다 ... –

+0

감사합니다,이 코드는 작동했습니다 : user1436187

+0

. 나는 디스크에 준비된 예제를 가지고 있었고 전에 다른 ppl을 위해 썼다. 나는 그것을 공유 할 것이라고 생각했다. – Backlin

관련 문제