[Rcpp-devel] data.frame from R to C++?

Romain Francois romain at r-enthusiasts.com
Tue Apr 12 13:30:51 CEST 2011


Hmmm. I have a bad feeling about this. I sense a disturbance in the force.

It goes down to coerceVector not doing its job on factors:

require( Rcpp )
require( inline )
v1 <- as.factor( c("c3", "c1", "c2" ) )
fx <- cfunction( signature( x = "factor" ), '
     SEXP s = PROTECT( coerceVector( x, STRSXP ) ) ;
     UNPROTECT(1);
     return s ;
' )


 > fx( as.integer( v1 ) )
[1] <NA> <NA> <NA>
Levels: c1 c2 c3

 > version
                _
platform       x86_64-apple-darwin9.8.0
arch           x86_64
os             darwin9.8.0
system         x86_64, darwin9.8.0
status         beta
major          2
minor          13.0
year           2011
month          04
day            04
svn rev        55296
language       R
version.string R version 2.13.0 beta (2011-04-04 r55296)

coerceVector is used by r_cast<STRSXP>, which is used by the ctor for 
StringVector.

...

Le 12/04/11 12:38, deqiang sun a écrit :
> How should I read the txt in the following context?
> c3	3a
> c1	1b
> c2	2c
>
> The code I have is
> 		RInside R(argc, argv);
> 		SEXP ans;
>
> 		std::string txt = "a=read.csv('xxx.xls',sep='\t',head=F)";
> 		ans = R.parseEval(txt);
> 		Rcpp::DataFrame DF(ans);
>
> 		Rcpp::StringVector x1 = DF["V1"];
> 		Rcpp::StringVector x2 = DF["V2"];
>
> But the print of x1 and x2 is
> 3	3	
> 1	1	
> 2	2	
>
> What's wrong with my code?
>
> Thanks,
>
> Dsun
> On Apr 12, 2011, at 4:14 AM, Romain Francois wrote:
>
>> Le 12/04/11 10:57, deqiang sun a écrit :
>>> Hi Dirk,
>>>
>>> Thanks very much for your example. From this example I learned how to passing data back and forth between R and C++.
>>> The example is R code and uses piece of C++ code in side R program.
>>> Well, it's better if you put this example(by only making slight changes to make R embeded in C++) inside package RInside.
>>>
>>> Accessing data by column name is the feature I ( and other people) usually want.
>>> However, is there a way to access the data Frame by row number?
>>
>> No. You access the column, and then do whatever with each element, as in
>> Dirk's example.
>>
>>> Regards.
>>>
>>> Dsun
>>> On Apr 8, 2011, at 9:56 AM, Dirk Eddelbuettel wrote:
>>>
>>>>
>>>> Ok, I now committed a slightly nice example to RcppExamples, a package I
>>>> should revamp to contain more examples.  In there, we now receive a
>>>> data.frame, operate on each column, create a new data and return old and new.
>>>>
>>>> The core of the code (inside the try/catch protection) is
>>>>
>>>>       // 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));
>>>>
>>>>
>>>> Dirk
>>>> --
>>>> Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
>>
>> --
>> Romain Francois
>> Professional R Enthusiast
>> +33(0) 6 28 91 30 30
>> http://romainfrancois.blog.free.fr
>> http://romain-francois.com
>> |- http://bit.ly/fhqbRC : Rcpp workshop in Chicago on April 28th
>> |- http://bit.ly/dFyZGB : Hydraulique au Montpellier Comedie Club
>> `- http://bit.ly/eVXit9 : Eponyme : 40 minutes stand up
>>
>>
>
>


-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
http://romain-francois.com
|- http://bit.ly/fhqbRC : Rcpp workshop in Chicago on April 28th
|- http://bit.ly/dFyZGB : Hydraulique au Montpellier Comedie Club
`- http://bit.ly/eVXit9 : Eponyme : 40 minutes stand up




More information about the Rcpp-devel mailing list