有没有办法使用data.table
和/或Rcpp
将RcppArmadillo
个对象传递给c ++函数,而无需手动转换为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)
c ++函数
NumericMatrix test_rcpp(NumericMatrix X) {
return(X);
}
mat test_arma(mat X) {
return(X);
}
答案 0 :(得分: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 ;
}
因此,正如马修所说,这会将data.table
视为data.frame
(Rcpp::DataFrame
中的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
的内部。
答案 1 :(得分:9)
尝试将data.table
作为DataFrame
而不是NumericMatrix
传递。无论如何它都是data.frame
,具有相同的结构,所以你不需要转换它。
答案 2 :(得分:4)
Rcpp位于编码为SEXP的 native R类型之上。这包括例如data.frame
或matrix
。
data.table
不是原生的,它是一个附加组件。所以有人想要这个(你?)必须写一个转换器,或者为其他人提供资金来写一个。
答案 3 :(得分: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