[R] Modifying Internal C Files

Ken Kelley KKIII at Indiana.Edu
Tue Nov 8 04:25:09 CET 2005


Hi Duncan and others.

Thanks for your insight. Actually, I did change the function name in the 
pnbeta2.c code (I should have said so). When I check the package I get 
no errors. I build the package and all seems well. When I install and 
then load the package in R, I get:

 > pnbeta2
function (x, a, b, lambda, low.tail, log.p)
{
     res <- .Internal("pnbeta2", as.double(x), as.double(a), 
as.double(b), as.double(lambda), as.integer(low.tail), as.integer(log.p))
     return(list(res))
}
<environment: namespace:try>

which seems good, but the function does not work:

pnbeta2(.1, 10, 25, 2, TRUE, FALSE)
Error in pnbeta2(0.1, 10, 25, 2, TRUE, FALSE) :
         7 arguments passed to '.Internal' which requires 1

When I try to run the .Internal file directly is perhaps where my 
problems begin:
 > .Internal(pnbeta2(.1, 10, 25, 2, TRUE, FALSE))
Error in .Internal(pnbeta2(0.1, 10, 25, 2, TRUE, FALSE)) :
         no internal function "pnbeta2"

But, when I do the same thing to the pnbeta internal function (which 
pnbeta2 is identical to at this point) I get the result:
 > .Internal(pnbeta(.1, 10, 25, 2, TRUE, FALSE))
[1] 0.0006837318

So, I'm at a loss for what is going on in this situation. my pnbeta2 
internal function doesn't seem to be there. What I want to do is simple 
(modify an interal C file), but it is proving to be quite difficult for 
me to implement.

Thanks for any thoughts,
Ken


Duncan Murdoch wrote:
> On 11/7/2005 5:17 PM, Ken Kelley wrote:
> 
>> Hi All.
>> I want to tweak a few minor things inside of internal C code. I have 
>> my Win. XP machine set-up to build packages (including C code), but 
>> I'm having problems getting the package to run correctly. In 
>> particular, I want to modify a few things inside of pnbeta.c (namely 
>> errmax and itrmax), which is what the pbeta() function calls upon when 
>> there is a noncentral parameter. I copied the pnbeta.c C code, changed 
>> its name [to pnbeta2.c], included the nmath.h, dpq.h files, lgamma.c, 
>> and pbeta.c in my src folder (since the .h files were called upon and 
>> the .c files were). I then created an R function that I thought would 
>> call upon the new C code:
>>
>> pnbeta2 <- function(x, a, b, lambda, low.tail, log.p)
>> {
>> res <- .C("pnbeta2", as.double(x), as.double(a), as.double(b), 
>> as.double(lambda), as.integer(low.tail), as.integer(log.p))
>> return(list(res))
>> }
>>
>> But after I built the package and loaded it it, the function doesn't 
>> work (it isn't even recognized). I have no idea why this is failing. 
>> Any information to help me figure out what I need to do to modify 
>> internal C code generally, or specifically as it applies to this 
>> scenario would be most helpful.
> 
> 
> You didn't say that you changed the name of the function, only the file 
> that contained it.  If this wasn't an oversight, then you should put
> 
> double pnbeta2(double x, double a, double b, double lambda,
>           int lower_tail, int log_p)
> 
> in the appropriate place in your pnbeta2.c file.
> 
> The other thing you should do is to add a PACKAGE argument to your .C 
> call, just in case there is already a pnbeta2 function somewhere else 
> (or will be some day).  In fact, if you do this, there should be no need 
> to change the name of the function:  R will look in the package DLL 
> rather than R.dll to find it.  Just make sure that the name in the .C 
> call matches the declared name in the source.
> 
> Duncan Murdoch
> 

-- 
Ken Kelley, Ph.D.
Inquiry Methodology Program
Indiana University
201 North Rose Avenue, Room 4004
Bloomington, Indiana 47405
http://www.indiana.edu/~kenkel




More information about the R-help mailing list