[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