[Rd] How do I access class slots from C?

Romain Francois romain.francois at dbmail.com
Wed Sep 30 09:54:50 CEST 2009


On 09/30/2009 09:45 AM, Abhijit Bera wrote:
> Hi
>
> I'm pulling financial datasets from a DB, converting it to a timeseries
> object then creating a returns object out of it.

Right, so the data is in the database.

> I plan to embed R into an application, which is why I'm taking this
> route of using C.

Sure. My point is (take it or leave it) since you are already using some 
R packages (fPortfolio, etc ...) why don't you just write one that 
contains a set of simple utility functions that are only aimed at 
simplifying your C code, and call these from C.

I'd find this much easier to code, document and test ... but eventually 
you should do what __you__ find easier/better

Romain

> Regards
>
> Abhijit
>
> On Wed, Sep 30, 2009 at 12:07 PM, Romain Francois
> <romain.francois at dbmail.com <mailto:romain.francois at 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<edd at debian.org <mailto:edd at 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):
>
>             edd at 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
>             edd at 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(ewPortfolio at 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



More information about the R-devel mailing list