Hi Romain I got what ur saying. Good idea. First I convert the data into a timeseries and return object using C, then I pass it onto an R function which I have written, I call the R function from my C code, it evaluates and then I process the values returned by it in my C code. Much simpler that way. So, I can do away with all these confusing constructs. :)
What about performance? You think I will see a difference if I follow a C only approach of creating all the objects? Regards Abhijit On Wed, Sep 30, 2009 at 12:45 PM, Abhijit Bera <abhib...@gmail.com> wrote: > Hi > > I'm pulling financial datasets from a DB, converting it to a timeseries > object then creating a returns object out of it. > > I plan to embed R into an application, which is why I'm taking this route > of using C. > > Regards > > Abhijit > > > On Wed, Sep 30, 2009 at 12:07 PM, Romain Francois < > romain.franc...@dbmail.com> wrote: > >> On 09/30/2009 08:51 AM, Abhijit Bera wrote: >> >>> >>> Hi >>> >>> Thanks all of you for your suggestions. I will put up my code shortly >>> based >>> on your suggestions. >>> >>> I wonder how the parsing and eval will work when most of my data comes in >>> from an external source like a DB? Probably it would be more efficient >>> to >>> make an object? Hmmmm... maybe it has to be a mix of parsing and eval? >>> >> >> What's in the database ? Is this the data or the R code ? What's wrong >> with writing your own set of R functions and evaluate calls to these >> functions instead of basically replicate this in C or C++ or whatever. >> >> Dirk's code certainly is nicer, but would you really do it like that in >> real life ? >> >> Romain >> >> >> Yes, the lang4 c idea sucks. mkstring is better. >>> >>> Regards >>> >>> Abhijit >>> >>> >>> On Tue, Sep 29, 2009 at 11:55 PM, Dirk Eddelbuettel<e...@debian.org> >>> wrote: >>> >>> >>>> This is so much fun. The C code posted wasn't exactly legible. So here >>>> is >>>> a >>>> new C++ variant that I just committed to the RInside SVN as a new >>>> example. >>>> And it mine works (against RInide and Rcpp as on CRAN): >>>> >>>> e...@ron:~/svn/rinside/pkg/inst/examples> ./rinside_sample4 >>>> Package 'sn', 0.4-12 (2009-03-21). Type 'help(SN)' for summary >>>> information >>>> Using the GLPK callable library version 4.37 >>>> >>>> Title: >>>> MV Feasible Portfolio >>>> Estimator: covEstimator >>>> Solver: solveRquadprog >>>> Optimize: minRisk >>>> Constraints: LongOnly >>>> >>>> Portfolio Weights: >>>> SBI SPI SII LMI MPI ALT >>>> 0.1 0.1 0.1 0.1 0.3 0.3 >>>> >>>> Covariance Risk Budgets: >>>> SBI SPI SII LMI MPI ALT >>>> -0.0038 0.1423 0.0125 -0.0058 0.4862 0.3686 >>>> >>>> Target Return and Risks: >>>> mean mu Cov Sigma CVaR VaR >>>> 0.0548 0.0548 0.4371 0.4371 1.0751 0.6609 >>>> >>>> Description: >>>> Tue Sep 29 13:43:36 2009 by user: >>>> SBI -0.00380065 >>>> SPI 0.142261 >>>> SII 0.0125242 >>>> LMI -0.00576251 >>>> MPI 0.486228 >>>> ALT 0.368551 >>>> e...@ron:~/svn/rinside/pkg/inst/examples> >>>> >>>> The final few lines are C++ accessing the result, earlier in the code I >>>> assign the weight vector from C++ as you desired from C. All with error >>>> checking / exception handling and what have in under 60 lines of (IMHO >>>> more >>>> readable) code -- see below. >>>> >>>> Dirk >>>> >>>> // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8; >>>> -*- >>>> // >>>> // Another simple example inspired by an r-devel mail by Abhijit Bera >>>> // >>>> // Copyright (C) 2009 Dirk Eddelbuettel and GPL'ed >>>> >>>> #include "RInside.h" // for the embedded R via >>>> RInside >>>> #include "Rcpp.h" // for the R / Cpp interface >>>> used >>>> for transfer >>>> #include<iomanip> >>>> >>>> int main(int argc, char *argv[]) { >>>> >>>> try { >>>> RInside R(argc, argv); // create an embedded R instance >>>> SEXP ans; >>>> >>>> std::string txt = "suppressMessages(library(fPortfolio))"; >>>> if (R.parseEvalQ(txt)) // load library, no return value >>>> throw std::runtime_error("R cannot evaluate '" + txt + "'"); >>>> >>>> txt = "lppData<- 100 * LPP2005.RET[, 1:6]; " >>>> "ewSpec<- portfolioSpec(); " >>>> "nAssets<- ncol(lppData); "; >>>> if (R.parseEval(txt, ans)) // prepare problem >>>> throw std::runtime_error("R cannot evaluate '" + txt + "'"); >>>> >>>> const double dvec[6] = { 0.1, 0.1, 0.1, 0.1, 0.3, 0.3 }; // >>>> choose >>>> any weights you want >>>> const std::vector<double> w(dvec,&dvec[6]); >>>> >>>> R.assign( w, "weightsvec"); // assign STL vector to R's >>>> 'weightsvec' variable >>>> >>>> txt = "setWeights(ewSpec)<- weightsvec"; >>>> if (R.parseEvalQ(txt)) // evaluate assignment >>>> throw std::runtime_error("R cannot evaluate '" + txt + "'"); >>>> >>>> txt = "ewPortfolio<- feasiblePortfolio(data = lppData, spec = >>>> ewSpec, constraints = \"LongOnly\"); " >>>> "print(ewPortfolio); " >>>> "vec<- getCovRiskBudgets(ewportfo...@portfolio)"; >>>> if (R.parseEval(txt, ans)) // assign covRiskBudget weights >>>> to >>>> ans >>>> throw std::runtime_error("R cannot evaluate '" + txt + "'"); >>>> RcppVector<double> V(ans); // convert SEXP variable to an >>>> RcppMatrix >>>> >>>> R.parseEval("names(vec)", ans); // assign columns names to ans >>>> RcppStringVector names(ans); >>>> >>>> for (int i=0; i<names.size(); i++) { >>>> std::cout<< std::setw(16)<< names(i)<< "\t" >>>> << std::setw(11)<< V(i)<< "\n"; >>>> } >>>> >>>> } catch(std::exception& ex) { >>>> std::cerr<< "Exception caught: "<< ex.what()<< std::endl; >>>> } catch(...) { >>>> std::cerr<< "Unknown exception caught"<< std::endl; >>>> } >>>> >>>> exit(0); >>>> } >>>> >>> >> >> >> -- >> Romain Francois >> Professional R Enthusiast >> +33(0) 6 28 91 30 30 >> http://romainfrancois.blog.free.fr >> |- http://tr.im/ztCu : RGG #158:161: examples of package IDPmisc >> |- http://tr.im/yw8E : New R package : sos >> `- http://tr.im/y8y0 : search the graph gallery from R >> >> > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel