Hi Simon

Thanks. All the confusion between CHAR and STRING. First I read this :

http://www1.cuni.cz/~obo/r_surprises.html

In the meantime I got your reply. Then I read the documentation and it made
sense!

Regards

Abhijit Bera

On Fri, Aug 28, 2009 at 6:49 PM, Simon Urbanek
<simon.urba...@r-project.org>wrote:

>
> On Aug 28, 2009, at 7:41 AM, Abhijit Bera wrote:
>
>  Hi Martin
>>
>> Here's the code. I'm stuck at one point. I cannot figure out how to print
>> the dimnames. I've commented it in my code:
>>
>> int main (int argc, char** argv) {
>>
>>   SEXP e,t1,t2,val;
>>   int errorOccurred,nx,ny,i,j;
>>   double *v;
>>   char x[1024],y[1024];
>>
>>   Rf_initEmbeddedR(argc, argv);
>>
>>   PROTECT(e = lang2(install("library"), mkString("fPortfolio")));
>>   R_tryEval(e, R_GlobalEnv, NULL);
>>   UNPROTECT(1);
>>
>>
>>   PROTECT(e = lang2(install("as.matrix"),install("SWX.RET")));
>>   PROTECT(t1 = (R_tryEval(e, NULL, &errorOccurred)));
>>
>>   v=REAL(t1);
>>
>>   PROTECT(t2=getAttrib(t1,R_DimSymbol));
>>
>>
> FWIW no need to protect it - t1 is already protected and even more so you
> are blowing t2 away two lines later anyway ...
>
>
>    nx=INTEGER(t2)[0];
>>   ny=INTEGER(t2)[1];
>>
>>   PROTECT(t2=getAttrib(t1,R_DimNamesSymbol));
>>
>>
> Again, no need to protect - you have protected t1 already ...
>
>
>    // I'm getting stuck here.
>>  // I want to print out the dimnames
>>  // so that I can get the dates for the timeseries object.
>>   strcpy(x,(CHAR(VECTOR_ELT(t2,0))[0]));
>>
>
> Please read docs about character vectors - what you probably meant is
> something like
> const char *x = CHAR(STRING_ELT(VECTOR_ELT(t2,0), 0));
> printf("dim 1 = (%s, ...)\n", x);
>
> Cheers,
> Simon
>
>
>
>    strcpy(y,(CHAR(VECTOR_ELT(t2,1))[0]));
>>
>>   printf("%d * %d\n  %s %s \n Matrix:\n",nx,ny,x,y);
>>
>>   // The matrix is stored in column major order so
>>   // we print it in this manner.
>>   // my previous code was incorrect.
>>   for(i=0;i<nx;i++,j++) {
>>
>>       for(j=0;j<ny;j++)
>>        printf("%f ",v[i+(j*ny)]);
>>
>>       printf("\n");
>>
>>   }
>>
>>   //UNPROTECT(3);
>>
>>   return 0;
>>
>> }
>>
>> On Wed, Aug 26, 2009 at 10:25 PM, Martin Morgan <mtmor...@fhcrc.org>
>> wrote:
>>
>>  Hi Abhijit --
>>>
>>> Abhijit Bera wrote:
>>>
>>>> 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)));
>>>>
>>>
>>> For what it's worth, and realizing that this is sloppiness in my
>>> original code, ScalarInteger(100) (and mkString("fPortfolio")) returns
>>> an unprotected SEXP, so it could in principle be garbage collected while
>>> lang3 is being evaluated...
>>>
>>>
>>>>   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);*/
>>>>
>>>
>>> the reason I recommended using as.list (for example) was to respect the
>>> implied abstraction between the object (of class 'timeSeries') and it's
>>> representation. Apparently there is a method as.list.timeSeries, and a
>>> list is something that I am allowed to know about. Your code below
>>> works, but doesn't respect the (R-level) abstraction the class author
>>> wants. I don't know whether this is regular practice in the R community,
>>> but it seems like the right thing to do.
>>>
>>> Martin
>>>
>>>
>>>>   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
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>        [[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