使用`Rcpp`和/或`RcppArmadillo将`data.table`传递给c ++函数

use*_*795 9 r rcpp data.table

有一种方法,以通过一个data.table使用对象来C++函数Rcpp和/或RcppArmadillo无需手动变换到data.table一个data.frame?在下面的示例中test_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)
Run Code Online (Sandbox Code Playgroud)

c ++函数

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

mat test_arma(mat X) {
    return(X);
}
Run Code Online (Sandbox Code Playgroud)

Rom*_*ois 12

在其他答案的基础上,这里是一些示例代码:

#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 ;
}
Run Code Online (Sandbox Code Playgroud)

所以,马太说,这种对待data.tabledata.frame(又名一Rcpp::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
Run Code Online (Sandbox Code Playgroud)

这完全忽略了内部的data.table.


Mat*_*wle 9

尝试传递data.tableas DataFrame而不是NumericMatrix.data.frame无论如何,它具有相同的结构,因此您不需要转换它.


Dir*_*tel 6

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

data.table不是原生的,它是一个附加组件。所以想要这个的人(你?)必须编写一个转换器,或者为其他人提供资金来编写一个转换器。

  • 如果确实有需要,为什么不呢。我想这将是额外的东西,因为我们不想依赖彼此的包。但是对`RcppDataTable` 包或其他任何东西的共同努力.. (3认同)
  • 谢谢@RomainFrancois 和德克。我已经可以在 Rcpp 中使用 as DataFrame 看到很多好处。如果有人需要,很高兴调查 DataTable Rcpp 类...... (2认同)