On 12 April 2011 at 05:38, deqiang sun wrote: | 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?
The read.csv() function and its cousins default to stringsAsFactors=TRUE. So the '3 1 2' are the factor levels. You want either std::string txt = "a=read.csv('xxx.xls',sep='\t'," "head=FALSE,stringsAsFactors=FALSE)"; or set it as a global option. Google for stringsAsFactors, this is documented and are ways around it. Dirk PS I personally would also set column names in the data file or R 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 | e...@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 | > | > | -- Dirk Eddelbuettel | e...@debian.org | http://dirk.eddelbuettel.com _______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel