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 <abhibera@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 <mtmorgan@fhcrc.org>
wrote:
>
>> Abhijit Bera <abhibera@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]]