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.franc...@dbmail.com <mailto: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 <mailto: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

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to