将数组发送到R函数(C ++)

时间:2012-06-19 07:36:11

标签: 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 put只是第一行数据帧之和的数字。

1 个答案:

答案 0 :(得分: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)
}