从Rcpp列表中提取数据框

3

这可能是一个非常简单的问题,但我无法弄清楚问题出在哪里。

我有一个列表传递到一个Rcpp函数,其中该列表的第一个元素是数据框。

如何获取那个数据框?

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(也称为'Rcpp::internal::generic_name_proxy<19, Rcpp::PreserveStorage>)转换为'Rcpp::DataFrame(也称为'Rcpp::DataFrame_ImplRcpp::PreserveStorage)不明确。

有人知道我缺少什么吗?谢谢。

1个回答

3

可能存在多个问题导致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/stackoverflow/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。模板编程很难,而且并不是所有的细节都能完全解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接