[Rcpp-devel] trouble creating a dataframe
Dirk Eddelbuettel
edd at debian.org
Tue Jun 5 00:02:01 CEST 2012
On 4 June 2012 at 17:28, Pratibha Rana wrote:
| Something seems to go wrong in Vector_create::create__dispatch.
|
| (gdb) p t1
| $14 = (const Rcpp::traits::named_object<std::vector<std::basic_string<char,
| std::char_traits<char>, std::allocator<char> >, std::allocator
| <std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >
| &) @0x7fff5d321780: {name = "datatype", object = std::vector of length 2,
| capacity 2 = {"varchar", "varchar"}}
|
| (gdb) p t2
| $18 = (const Rcpp::traits::named_object<std::vector<int, std::allocator<int> >
| > &) @0x7fff5d321760: {name = "length", object = std::vector of length 2,
| capacity 2 = {10, 10}}
|
| (gdb) p t3
| $19 = (const Rcpp::traits::named_object<std::vector<int, std::allocator<int> >
| > &) @0x7fff5d321740: {name = "scale", object = std::vector of length 2,
| capacity 2 = {0, 0}}
|
| (gdb) p res
| $17 = {<Rcpp::RObject> = {<No data fields>}, <Rcpp::VectorBase<19, true,
| Rcpp::Vector<19> >> = {<Rcpp::traits::expands_to_logical__impl<19>> = {<No data
| fields>}, <No data fields>}, <Rcpp::internal::eval_methods<19>> = {<No data
| fields>}, cache = {<Rcpp::traits::proxy_cache<19>> = {p = 0x0}, <No data
| fields>}}
|
|
| The value of res was printed at line 159 in Vector__create.h . Using Wrap()
| makes it worse. I really need help. I have been trying to do this for 2 days
| now.
What about the working example I just to the list?
What about the following adapted from the unit test file for dataframes:
R> library(inline)
R>
R> fx <- cxxfunction(signature(), plugin="Rcpp", body='
+ IntegerVector v = IntegerVector::create(1,2,3);
+ std::vector<std::string> s(3);
+ s[0] = "a";
+ s[1] = "b";
+ s[2] = "c";
+ return DataFrame::create(Named("a")=v, Named("b")=s);
+ ')
R>
R> fx()
a b
1 1 a
2 2 b
3 3 c
R>
I usually start from self-contained working examples and then try to
generalise to the specific issue at hand.
Hope this helps, Dirk
| On Mon, Jun 4, 2012 at 4:58 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
|
|
| Hi Pratibha,
|
| On 4 June 2012 at 16:12, Pratibha Rana wrote:
| | I am at my wits end trying to create a dataframe from a list of values
| that I
| | have. here's the code
| |
| | try{
| | int size = argTypes.getColumnCount();
| | std::vector<std::string> nameVec(size);
| | std::vector<int> lenVec(size);
| | std::vector<int> scaleVec(size);
|
| Good. Three STL vectors which should get autmatic conversion via wrap().
|
| [...]
|
| | //create the dataframe
| | Rcpp::List df = Rcpp::List::create(Rcpp::Named
| ("datatype",nameVec),
| |
| Rcpp::Named("length",lenVec),
| |
| Rcpp::Named("scale",scaleVec));
| | Rcpp::DataFrame df_final = Rcpp::DataFrame::create(df);
| | return df_final;
|
| [...]
|
| | The std::vectors are created fine but the list is not created
| | (gdb) p R_PV(df)
| | $3 = 0
| |
| |
| | I have tried a lot of variation like creating the dataframe directly
| without
| | first creating the list. Nothing seems to be working.
|
| It should work. I believe we posted example on the list, blog, possibly in
| RcppExamples, ...
|
|
| In fact, the latter one may be the best key. Consider this example taken
| straight from the RcppExamples packages (which never became "the"
| collection
| of examples [ contributions welcome ] but has this ...)
|
| RcppExport SEXP RcppDataFrame(SEXP Dsexp) {
|
| try { // or
| use BEGIN_RCPP macro
|
| // construct the data.frame object
| Rcpp::DataFrame DF = Rcpp::DataFrame(Dsexp);
|
| // and access each column by name
| Rcpp::IntegerVector a = DF["a"];
| Rcpp::CharacterVector b = DF["b"];
| Rcpp::DateVector c = DF["c"];
|
| // do something
| a[2] = 42;
| b[1] = "foo";
| c[0] = c[0] + 7; // move up a week
|
| // create a new data frame
| Rcpp::DataFrame NDF =
| Rcpp::DataFrame::create(Rcpp::Named("a")=a,
| Rcpp::Named("b")=b,
| Rcpp::Named("c")=c);
|
| // and return old and new in list
| return(Rcpp::List::create(Rcpp::Named("origDataFrame")=DF,
| Rcpp::Named("newDataFrame")=
| NDF));
|
| } catch( std::exception &ex ) { // or use END_RCPP
| macro
| forward_exception_to_r( ex );
| } catch(...) {
| ::Rf_error( "c++ exception (unknown reason)" );
| }
| return R_NilValue; // -Wall
| }
|
|
| The main difference is that we use Rcpp vectors. So you could try
|
| -- wrap() in the create() call
| -- converting the Rcpp vectors to STL vectors
| -- debugging why STL vectors don't pass through
|
| Please keep the list posted on your progress.
|
| Dirk
|
| --
| Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
|
|
|
| ----------------------------------------------------------------------
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
--
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
More information about the Rcpp-devel
mailing list