11

有没有办法使用和/或不手动转换为a将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 ;
}

因此,正如 Matthew 所说,这将 thedata.table视为 a data.frame(又名 a Rcpp::DataFramein Rcpp)。

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.tableas aDataFrame而不是NumericMatrix. 无论如何,它data.frame具有相同的结构,因此您不需要转换它。

于 2012-12-08T14:04:25.923 回答
6

Rcpp位于编码为 SEXP 的原生R 类型之上。这包括例如data.framematrix

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 回答