0

この関数を 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 の出力は、データ フレームの最初の行の合計の単なる数値です。

4

1 に答える 1

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)
}
于 2012-06-19T09:43:20.247 に答える