带 Rcpp 的 data.tables(datatableAPI.h)

问题描述 投票:0回答:1

我学习将 Rcpp 与 data.table 包一起使用,以加快 R Markdown 中的 R 代码性能,因为我想生成报告。从https://github.com/Rdatatable/data.table/issues/4643,有datatableAPI.h,但我无法将我自己的分析应用于带有data.table的Rcpp。当我尝试修改以下 R 代码以适合我自己的分析时,它会产生错误,因为我尝试了很多方法。我可以从 https://github.com/Rdatatable/data.table/issues/4643:

运行以下 RCpp 代码

RCpp

library(data.table)
dt <- data.table(iris)
Rcpp::cppFunction("SEXP mysub2(SEXP x, SEXP rows, SEXP cols) { return dt::subsetDT(x,rows,cols); }", 
     include="#include <datatableAPI.h>", 
     depends="data.table")
mysub2(dt, 1:4, 1:4)

我可以知道如何将下面的 R 代码转换为如上所示的 Rccp 代码吗?感谢您的帮助。

R

name <- c("a", "a", "a", "a", "b")
value <- c(100, 200, 300, 400, 500)
group <- c("aa", "ab", "aa", "ab", "ab")
data <- data.table(name, value, group)

count <- 3

for(i in 1: count){
  data3 <- data[name == "a", .(mean_value = mean(value)), by = group]
}
data3

下面的Rcpp代码是我当前的工作。显示错误“ sourceCpp 中的错误(代码 = 代码,env = env,重建 = 重建,cacheDir = cacheDir,: 构建共享库时发生错误 1。”

library(data.table)
Rcpp::cppFunction("SEXP analysis(SEXP data) { return dt::subsetDT(data[name == 'a', .(mean_value = mean(value)), by = group]); }", 
     include="#include <datatableAPI.h>", 
     depends="data.table")

name <- c("a", "a", "a", "a", "b")
value <- c(100, 200, 300, 400, 500)
group <- c("aa", "ab", "aa", "ab", "ab")
data <- data.table(name, value, group)
analysis(data)
r data.table rcpp
1个回答
2
投票

欢迎来到 StackOverflow!我很高兴您找到了

data.table
的标题并使其正常工作 - 第一步应该很简单!

但是我们需要看看它提供了什么:

/* add a namespace for C++ use */
namespace dt {
  inline SEXP subsetDT(SEXP x, SEXP rows, SEXP cols) { 
        return DT_subsetDT(x, rows, cols); }
}

按行和列索引。正如您在示例中所做的那样。

现在看看你的例子:它不匹配。您假设您可以像在 R 提示符下一样提交任何奇怪的

data.table
表达式。编译器告诉你不能。

可悲的是,编译器是对的。这就是我们在这里能说的全部。

© www.soinside.com 2019 - 2024. All rights reserved.