11

を使用して、および/または手動でに変換せずに、data.tableオブジェクトを C++ 関数に渡す方法はありますか? 以下の例では、両方とも で失敗します。RcppRcppArmadillodata.tabledata.frametest_rcpp(X2)test_arma(X2)c++ exception (unknown reason)

Rコード

X=data.frame(c(1:100),c(1:100))
X2=data.table(X)
test_rcpp(X)
test_rcpp(X2)
test_arma(X)
test_arma(X2)

C++ 関数

NumericMatrix test_rcpp(NumericMatrix X) {
    return(X);
}

mat test_arma(mat X) {
    return(X);
}
4

4 に答える 4

13

他の回答の上に構築する、ここにいくつかのサンプルコードがあります:

#include <Rcpp.h>
using namespace Rcpp ;

// [[Rcpp::export]]
double do_stuff_with_a_data_table(DataFrame df){
    CharacterVector x = df["x"] ;
    NumericVector   y = df["y"] ;
    IntegerVector   z = df["v"] ;

    /* do whatever with x, y, v */
    double res = sum(y) ;
    return res ;
}

したがって、マシューが言うように、これはを(別名 a in )data.tableとして扱います。data.frameRcpp::DataFrameRcpp

require(data.table)
DT <- data.table(
    x=rep(c("a","b","c"),each=3), 
    y=c(1,3,6), 
    v=1:9)
do_stuff_with_a_data_table( DT ) 
# [1] 30

これは、の内部を完全に無視しdata.tableます。

于 2012-12-08T14:18:14.143 に答える
10

をではなくdata.tableとして渡してみてください。とにかく、同じ構造なので、変換する必要はありません。DataFrameNumericMatrixdata.frame

于 2012-12-08T14:04:25.923 に答える
6

Rcppは、SEXP としてエンコードされたネイティブR 型の上に位置します。これには、 や なども含まれdata.frameますmatrix

data.tableネイティブではなく、アドオンです。したがって、これを望む誰か (あなた?) は、コンバーターを作成するか、他の誰かがコンバーターを作成するための資金を提供する必要があります。

于 2012-12-08T01:33:41.080 に答える
3

参考までに、リストを介して更新を許可するようrcppにリストを出力するのは良いことだと思います。data.table

ダミーの例を次に示します。

cCode <- 
    '
     DataFrame DT(DTi);
     NumericVector x = DT["x"];
     int N = x.size();
     LogicalVector b(N);
     NumericVector d(N);
     for(int i=0; i<N; i++){
         b[i] = x[i]<=4;
         d[i] = x[i]+1.;
     }
     return Rcpp::List::create(Rcpp::Named("b") = b, Rcpp::Named("d") = d);
    ';

require("data.table");
require("rcpp");
require("inline");
DT <- data.table(x=1:9,y=sample(letters,9)) #declare a data.table
modDataTable <- cxxfunction(signature(DTi="data.frame"), plugin="Rcpp", body=cCode)

DT_add <- modDataTable(DT)  #here we get the list
DT[, names(DT_add):=DT_add] #here we update by reference the data.table
于 2013-01-21T21:12:53.300 に答える