Thanks guys. I see the mistake I was doing. I was forgetting an argument;
that's why I wasn't getting the output. "[" is a function.

On 9/16/09, mtmor...@fhcrc.org <mtmor...@fhcrc.org> wrote:
>
> 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
>>
>>
>
>
>

        [[alternative HTML version deleted]]

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

Reply via email to