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
<mailto: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
<mailto:mtmor...@fhcrc.org>> wrote:
Abhijit Bera <abhib...@gmail.com <mailto: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 <mailto: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