Hi

I'm trying to implement something similar to the following R snippet using
C. I seem to have hit the wall on accessing class slots using C.

library(fPortfolio)

lppData <- 100 * LPP2005.RET[, 1:6]
ewSpec <- portfolioSpec()
nAssets <- ncol(lppData)
setWeights(ewSpec) <- rep(1/nAssets, times = nAssets)

ewPortfolio <- feasiblePortfolio(
   data = lppData,
   spec = ewSpec,
   constraints = "LongOnly")

ewSpec is an object of type Portfolio Spec which has the following slots:

model slot
    type = "MV"                  a string value
    optimize = "minRisk"         a string value
    estimator = "covEstimator"   a function name
    tailRisk = list()            a list
    params =
      list(alpha=0.05, a=1, ...) a list
portfolio slot                   a list
    weights = NULL               a numeric vector
    targetReturn = NULL          a numeric value
    targetRisk = NULL            a numeric value
    riskFreeRate = 0             a numeric value
    nFrontierPoints = 50         an integer value
    status = NA)                 a integer value
optim slot                       a list
    solver = "solveRquadprog"    a function names
    objective = NULL             function names
    options = list()             a list with parameters
    control = list()             a list with controls
    trace = FALSE)               a logical
messages slot:                   a list
    list = list()                a list

I want to set the weights so that I can compute a feasiblePortfolio.
Unfortunately I cannot figure out how to do this from C.

Here is what I wrote so far:

#include <stdio.h>
#include <R.h>
#include <Rinternals.h>
#include <Rdefines.h>
#include <Rembedded.h>

int main(int argc, char** argv)
{

    SEXP
e,c,portSpec,portData,portConstr,portVal,portWeights,tsAssets,tsReturns,nAssets,reciprocal;
    int errorOccurred,nx,ny,i,j;
    double *v;
    const char *x,*y;

    Rf_initEmbeddedR(argc, argv);

    // loading fPortfolio
    PROTECT(e = lang2(install("library"), mkString("fPortfolio")));
    R_tryEval(e, R_GlobalEnv, NULL);
    UNPROTECT(1);


    // creating a default portfolioSpec object
    PROTECT(e=lang1(install("portfolioSpec")));
    PROTECT(portSpec=R_tryEval(e,R_GlobalEnv, NULL));

    // creating a portfolioData object


PROTECT(e=lang4(install("c"),mkString("SBI"),mkString("SPI"),mkString("SII")));
    PROTECT(tsAssets=R_tryEval(e,R_GlobalEnv,NULL));

    PROTECT(e=lang4(install("["),install("SWX.RET"),R_MissingArg,tsAssets));
    PROTECT(tsReturns=R_tryEval(e,R_GlobalEnv,NULL));

    PROTECT(e=lang3(install("*"),ScalarInteger(100),tsReturns));
    PROTECT(tsReturns=R_tryEval(e,R_GlobalEnv,NULL));

    PROTECT(e=lang3(install("portfolioData"),tsReturns,portSpec));
    PROTECT(portData=R_tryEval(e,R_GlobalEnv,NULL));

// Creating a portfolio constraints string
    PROTECT(portConstr=mkString("LongOnly"));

// Setting weights
    PROTECT(e=lang2(install("ncol"),tsReturns));
    PROTECT(nAssets=R_tryEval(e,R_GlobalEnv,NULL));

    PROTECT(e=lang3(install("/"),ScalarInteger(1),nAssets));
    PROTECT(reciprocal=R_tryEval(e,R_GlobalEnv,NULL));

    PROTECT(e=lang3(install("rep"),reciprocal,nAssets));
    PROTECT(portWeights=R_tryEval(e,R_GlobalEnv,NULL));

// Right now the program crashes here. It says: Cannot find function
"setWeights"
// How do I set the weights? It's a standard numeric vector. I'm confused on
access class slots from C.
// Not much is writted on this in the R extensions manual.

    PROTECT(e=lang3(install("setWeights"),portSpec,portWeights));
    PROTECT(portSpec=R_tryEval(e,R_GlobalEnv,NULL));

    PROTECT(e=lang2(install("print"),portSpec));
    R_tryEval(e,R_GlobalEnv,NULL);

    UNPROTECT(3);

    Rf_endEmbeddedR(0);

    return 0;
}

Regards
Abhijit Bera

        [[alternative HTML version deleted]]

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

Reply via email to