[Rd] Need help on calling Head from C

Hervé Pagès hpages at fhcrc.org
Fri Jun 27 00:06:54 CEST 2014


Hi,

On 06/26/2014 01:36 PM, Radford Neal wrote:
>>> PROTECT(dfm=lang3(install("data.frame"),df,ScalarLogical(FALSE)));
>>> SET_TAG(CDDR(dfm), install("stringsAsFactors")) ;
>>> SEXP res = PROTECT(eval(dfm,R_GlobalEnv));
>>> PROTECT(head=lang3(install("head"),res,ScalarInteger(1)));
>>> head  = PROTECT(eval(head,R_GlobalEnv));
>>>
>>>
>>> I tried the above following , it seemed to be not working . Can you please
>>> help.
>>>
>>
>> Can you elaborate? The above code works AFAICT ...
>
> The code is actually not safe.  Both "install" and "SalarLogical/Integer"
> potentially allocate memory, so at least one needs to be protected before
> callling lang3.  (Passing one such argument would be OK, since lang3
> protects its arguments, but it doesn't get a chance to do that while they
> are still being evaluated.)

How true but who can blame him? The Writing R Extensions manual
contains the same mistake:

   SEXP mkans(double x)
   {
     SEXP ans;
     ans = PROTECT(allocVector(REALSXP, 1));
     REAL(ans)[0] = x;
     UNPROTECT(1);
     return ans;
   }

   double feval(double x, SEXP f, SEXP rho)
   {
     defineVar(install("x"), mkans(x), rho);
     return REAL(eval(f, rho))[0];
   }

Reported here more than 6 years ago and never fixed:

   https://stat.ethz.ch/pipermail/r-devel/2008-January/048040.html

Cheers,
H.

>
> Now, I'm not sure this is the source of the actual problem, since both
> "data.frame" and "head" presumably already exist, so the install won't
> actually allocate memory.  But this is not a safe coding method in
> general.
>
>     Radford Neal
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

-- 
Hervé Pagès

Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M1-B514
P.O. Box 19024
Seattle, WA 98109-1024

E-mail: hpages at fhcrc.org
Phone:  (206) 667-5791
Fax:    (206) 667-1319



More information about the R-devel mailing list