Extract a data.frame from a list within Rcpp

Viewed 61

This is probably a really simple question, but I can't figure out what's wrong.

I have a list that I pass to an Rcpp function, and the first element of that list is a data.frame.

How do I get that data.frame?

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

foo(bar)

And the following C++ code:

#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;
}

I get the following error on the line DataFrame df_test = test["df"]:

error: conversion from 'Rcpp::Vector<19>::NameProxy{aka 'Rcpp::internal::generic_name_proxy<19, Rcpp::PreserveStorage> to 'Rcpp::DataFrame{aka 'Rcpp::DataFrame_ImplRcpp::PreserveStorage ambiguous

Anyone know what I'm missing? Thanks.

1 Answers

There may be a combination of issues going on with the instantiation and construction of List and DataFrame objects. See the (old !!) RcppExamples package for working examples.

Here is a repaired version of your code that works and does something with the vector inside the data.frame:

Code

#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)
*/

Demo

> 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
> 

Edit: For completeness, the assignment op can be used with a SEXP as in SEXP df2 = test["df"]; which can then used to instantiate a data.frame. Template programming is difficult and not all corners are completely smoothed.

Related