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