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

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

Reply via email to