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?

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);
> }
>
>
>
> --
> Three out of two people have difficulties with fractions.
>

        [[alternative HTML version deleted]]

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

Reply via email to