Quoting Abhijit Bera <abhib...@gmail.com>:

I'm trying to get a reference to this object in C

SWX.RET[1:6,c("SBI,"SPI","SII")]

While i am able to access and use a plain SWX.RET object, I'm getting
confused on how to create an object with the array subscripts like above.

Here is what I tried to do. It doesn't work because "[" is obviously not an
operation or function on SWX.RET. So how do I get a reference to this
object?

#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,tsAssets;
    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")));


Here you might just as well construct this at the C level

      SEXP idx_j = PROTECT(NEW_CHARACTER(3));
      SET_STRING_ELT(idx_j, 0, mkChar("SBI"));
      ...

(is a PROTECT necessary on mkChar? I don't think SET_STRING_ELT will allocate memory).

    PROTECT(c=R_tryEval(e,R_GlobalEnv,NULL));

    PROTECT(e=lang3(install("["),install("SWX.RET"),c));

Here the call you are trying for is "["(SWX.RET, i, j) so

      SEXP idx_i = PROTECT(NEW_INTEGER(6));
      for (i = 0; i < LENGTH(idx_i); ++i)
           INTEGER(idx_i)[i] = i + 1;

      PROTECT(e = lang4(install("["), install("SWX.RET"),
                        idx_i, idx_j));

or

      PROTECT(e = lang4(install("["), install("SWX.RET"),
                        R_MissingArg, idx_j));


While it would be straight-forward to use R_ParseVector to execute a string representing this command, presumably your real code will want to represent the subscripts (and object) as C variables and not hard-coded or user-supplied strings.

Martin

    PROTECT(portData=R_tryEval(e,R_GlobalEnv,NULL));

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


    UNPROTECT(3);

    Rf_endEmbeddedR(0);

    return 0;
}

        [[alternative HTML version deleted]]

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


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

Reply via email to