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

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


Le 12/04/11 13:30, Romain Francois a écrit :
> 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 ) )

Sorry, I meant fx( 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