2012-06-19 34 views
0

我已用C++編寫這樣的功能:發送數組R函數(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 OUT放是隻爲一個數數據幀的第一行之和。

+0

也許ñ< - nrow(第一)幫助? – Julius

+0

什麼是「長度(第一)」?另外,嘗試'twoColumn [[1]]'等,並省略不公開,無需'as.integer(N)','因爲是N'已經的整數,'總和=整數(N)'比更有效'代表...'。 –

回答

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

謝謝,此代碼已經工作: 添加< - function(twoColumn) {012;}; 第一個< - twoColumn [[1]] 第二< - twoColumn [[2]] ñ< - 長度(第一) .C( 「添加」,第一= as.integer(第一),第二=作爲。整數(秒), n = as.integer(n),sum = as.integer(rep(0,n)))$ sum } – user1436187

+0

'inline'包確實可以簡化這樣的小事情。我剛剛爲我之前爲其他ppl寫的光盤上的一個準備好的例子,並認爲我會分享它。 – Backlin