Search code examples
rcpp

Extract a data.frame from a list within Rcpp


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.


Solution

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