Hi Martin Thanks. I think I got it! Read the R extensions documentation again. I don't even need to convert to a list. This is what I did (just a demo):
#include <R.h> #include <Rinternals.h> #include <Rdefines.h> #include <Rembedded.h> int main (int argc, char** argv) { SEXP e,t1,t2,val; int errorOccurred,nx,ny,i,j; double *v; Rf_initEmbeddedR(argc, argv); PROTECT(e = lang2(install("library"), mkString("fPortfolio"))); R_tryEval(e, R_GlobalEnv, NULL); UNPROTECT(1); /* We try to evaluate the R expression: * round(cov(100 * SWX.RET), digits = 4) * we shall split it as: * t1<-100*SWX.RET * t2<-cov(t1) * val<-round(t2,4) */ PROTECT(e = lang3(install("*"),ScalarInteger(100), install("SWX.RET"))); PROTECT(t1 = (R_tryEval(e, NULL, &errorOccurred))); PROTECT(e = lang2(install("cov"),t1)); PROTECT(t2 = (R_tryEval(e, NULL, &errorOccurred))); PROTECT(e = lang3(install("round"),t2, ScalarInteger(4))); PROTECT(val = (R_tryEval(e, NULL, &errorOccurred))); Rf_PrintValue(val); /* This isn't required, is extraneous. PROTECT(e = lang2(install("as.list"),val)); PROTECT(t2 = (R_tryEval(e, NULL, &errorOccurred))); Rf_PrintValue(t2);*/ v=REAL(val); PROTECT(t2=getAttrib(val,R_DimSymbol)); nx=INTEGER(t2)[0]; ny=INTEGER(t2)[1]; /* Just printing out the matrix * To understand how I can convert * data types b/w R and C */ printf("Matrix:\n"); for(i=0,j=0;i<(nx*ny);i++,j++) { printf("%.4f ",v[i]); if(j==ny-1) { printf("\n"); j=0; } } UNPROTECT(6); return 0; } Regards Abhijit Bera On Wed, Aug 26, 2009 at 12:37 PM, Abhijit Bera <abhib...@gmail.com> wrote: > Hi Martin > > Thanks. I think I got the hang of it. I will try it out and post any more > queries I have regarding handling data types onto the mailing list. > > Regards > > Abhijit Bera > > > On Tue, Aug 25, 2009 at 7:15 PM, Martin Morgan <mtmor...@fhcrc.org> wrote: > >> Abhijit Bera <abhib...@gmail.com> writes: >> >> > Hi >> > >> > I think I have asked these questions earlier, but I been able to find >> > answers from the documentation (which I found poorly written in several >> > places). Will someone be kind enough to give me answers and enlighten >> me? >> > (as in explain with CODE?) >> > >> > I want to embed R in my application and use the fPortfolio package for >> > carrying out risk management computations. Right now I'm reading the >> > Rmetrics Ebook and trying to convert the various examples into embedded >> C >> > code. >> > >> > Coming from a strictly C background, I have slight difficulty in >> > comprehending a functional language like R and it gets worse when I try >> to >> > embed R into a procedural language like C. So here is a list of my >> doubts: >> > >> > 1) I am very confused on how the lang 1 2 3 4 ... set of functions work. >> I >> > haven't found any relevant documentation explaining it clearly. I have a >> > vague idea but still I cannot understand how I would evaluate an R >> > expression like Covariance <- round(cov(100 * SWX.RET), digits = 4) >> using >> > lang, install and R_tryEval. >> >> unroll this as >> >> tmp0 <- 100 * SWX.RET >> tmp1 <- cov(tmp0) >> result <- round(tmp2, 4L) >> >> so (untested) >> >> PROTECT(expr = >> lang3(install("*"), scalarNumeric(100), install("SWX.RET"))); >> PROTECT(tmp0 = tryEval(expr, R_GlobalEnv, &errorOccurred)); >> if (errorOccurred) >> exit(1); >> >> PROTECT(expr = lang2(install("cov"), tmp0)); >> PROTECT(tmp1 = tryEval(expr, R_GlobalEnv, &errorOccurred)); >> if (errorOccurred) >> exit(1); >> >> PROTECT(expr = lang3(install("round"), tmp1, scalarInteger(4))); >> PROTECT(result = tryEval(expr, R_GlobalEnv, &errorOccurred)); >> if (errorOccurred) >> exit(1); >> >> Rf_PrintValue(result); >> UNPROTECT(6); >> >> >> >> > 2) What exactly does install do? >> >> creates or locates a symbol in the global symbol table. Every unique >> symbol is recorded and stored in the 'global symbol table'. An >> environment is then a mapping between a symbol from this table, and a >> value unique to the environment. The symbols are being reused across >> environments. >> >> In R >> >> x <- 10 >> >> creates a symbol x in the global symbol table, and in the global >> environment associates the value 10 with that symbol. >> >> env = new.env() >> env$x <- 20 >> >> uses the same symbol 'x' from the same global symbol table, but >> associates the value 20 with it in the environment 'env'. >> >> In C >> >> install("foo"); >> >> creates a symbol and returns the appropriate SEXP. And then >> >> install("foo") >> >> again finds the already-defined symbol and returns the same SEXP. >> >> > 3) I wrote the following code: >> > >> > #include <Rinternals.h> >> > #include <Rembedded.h> >> > >> > int main (int argc, char** argv) { >> > >> > SEXP e,val; >> > int errorOccurred; >> > >> > Rf_initEmbeddedR(argc, argv); >> > >> > // library("fPortfolio") >> > PROTECT(e = lang2(install("library"), mkString("fPortfolio"))); >> > R_tryEval(e, R_GlobalEnv, NULL); >> > UNPROTECT(1); >> > >> > // colMeans(SWX.RET) >> > PROTECT(e = lang2(install("colMeans"), install("SWX.RET"))); >> > val = (R_tryEval(e, NULL, &errorOccurred)); >> > >> > Rf_PrintValue(val); >> > >> > return 0; >> > >> > } >> > >> > When I tried : >> > >> >>mean(SWX.RET) >> > >> > in the R prompt I got the following output: >> > >> > SBI SPI SII LP25 LP40 >> > LP60 >> > 4.660521e-06 2.153198e-04 2.033869e-04 1.388886e-04 1.349041e-04 >> > 1.226859e-04 >> > >> > >> > However when I replaced colMeans with mean in the C code above I got a >> mean >> > of the means (0.0001366410) of all the columns when Rf_PrintValue was >> > called. Using colMeans gave me the output as shown above. Why does this >> > happen? How do I get the above output using mean? >> >> Guessing a little; I don't know what class SWX.RET is, but perhaps >> there is a method mean.class_of_SWX.RET defined in a package that is >> loaded in your R session, but not your C session. In a new R I see >> >> > library(fPortfolio) >> > mean(SWX.RET) >> [1] 0.0001366410 >> >> > 4) From the above code segment, how can I deal with the SEXPREC val >> which is >> > returned by R_tryEval in the above code and convert it to my own local >> > vector datatype? How do I access the values of val? val will now be a >> > timeseries so how do i convert it? >> >> Convert it to a 'standard' R object using appropriate R functions and >> access it using C, e.g., >> >> > lst <- as.list(SWX.RET) >> > str(lst) >> List of 6 >> $ SBI : num [1:1916] -0.002088 -0.000105 -0.00136 0.000419 0 ... >> $ SPI : num [1:1916] -0.03439 -0.01041 0.01212 0.02246 0.00211 ... >> $ SII : num [1:1916] 1.37e-05 -4.96e-03 3.81e-03 -6.16e-04 2.38e-03 ... >> $ LP25: num [1:1916] -0.01199 -0.00366 -0.00132 0.00771 0.00303 ... >> $ LP40: num [1:1916] -0.01801 -0.00584 -0.00164 0.01166 0.00457 ... >> $ LP60: num [1:1916] -0.02616 -0.00901 -0.0024 0.01706 0.00695 ... >> >> so in C, once I have lst, I could >> >> sbi = VECTOR_ELT(lst, 0); >> double *vals = NUMERIC(sbi); >> printf("%f", vals[0]); # -002088 >> >> Hope that helps, and is not too misleading, I didn't have time to >> check carefully. >> >> Martin >> >> > Thanks >> > >> > Abhijit Bera >> > >> > [[alternative HTML version deleted]] >> > >> > ______________________________________________ >> > R-devel@r-project.org mailing list >> > https://stat.ethz.ch/mailman/listinfo/r-devel >> >> -- >> Martin Morgan >> Computational Biology / Fred Hutchinson Cancer Research Center >> 1100 Fairview Ave. N. >> PO Box 19024 Seattle, WA 98109 >> >> Location: Arnold Building M1 B861 >> Phone: (206) 667-2793 >> > > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel