从 Rcpp 中的列表中提取 data.frame

Extract a data.frame from a list within Rcpp

这可能是一个非常简单的问题,但我不知道哪里出了问题。

我有一个传递给 Rcpp 函数的列表,该列表的第一个元素是 data.frame。

如何获得 data.frame?

bar = list(df = data.frame(A = 1:3,B=letters[1:3]),some_other_variable = 2)

foo(bar)

以及以下 C++ 代码:

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::NumericVector bar(Rcpp::List test){
  Rcpp::DataFrame df_test = test["df"];
  Rcpp::NumericVector result = df_test["A"];
  return result;
}

我在 DataFrame df_test = test["df"] 行收到以下错误:

错误:从 'Rcpp::Vector<19>::NameProxy{aka 'Rcpp::internal::generic_name_proxy<19, Rcpp::PreserveStorage> 转换为 'Rcpp::DataFrame{又名 'Rcpp::DataFrame_ImplRcpp::PreserveStorage 模棱两可

有人知道我错过了什么吗?谢谢

ListDataFrame 对象的实例化和构造可能会同时出现一些问题。请参阅(旧 !!)RcppExamples 包以获取工作示例。

这是您的代码的修复版本,可以使用 data.frame 中的 vector 执行某些操作:

代码

#include <Rcpp.h>

// [[Rcpp::export]]
int bar(Rcpp::List test){
    Rcpp::DataFrame df(test["df"]);
    Rcpp::IntegerVector ivec = df["A"];
    return Rcpp::sum(ivec);
}

/*** R
zz <- list(df = data.frame(A = 1:3,B=letters[1:3]),some_other_variable = 2)
bar(zz)
*/

演示

> Rcpp::sourceCpp("~/git/Whosebug/70035630/answer.cpp")
> zz <- list(df = data.frame(A = 1:3,B=letters[1:3]),some_other_variable = 2)
> bar(zz)
[1] 6
> 

编辑: 为了完整起见,赋值操作可以与 SEXP 一起使用,如 SEXP df2 = test["df"]; 中那样,然后可以用于实例化 data.frame.模板编程难度大,并非所有角落都完全磨平