[R] the use of the .C function
Bernardo Lagos Alvarez
bla at udec.cl
Sat Oct 13 18:53:49 CEST 2007
Dear All,
could someone please shed some light on the use of the .C or .Fortran function:
I am trying load and running on R the following function
// psi.cpp -- psi function for real arguments.
// Algorithms and coefficient values from "Computation of Special
// Functions", Zhang and Jin, John Wiley and Sons, 1996.
//
// (C) 2003, C. Bond. All rights reserved.
//
// Returns psi function for real argument 'x'.
// NOTE: Returns 1e308 for argument 0 or a negative integer.
//
#include <iostream.h> // or <stdio.h>?
#include <math.h>
#define el 0.5772156649015329
double psi(double x)
{
double s,ps,xa,x2;
int n,k;
static double a[] = {
-0.8333333333333e-01,
0.83333333333333333e-02,
-0.39682539682539683e-02,
0.41666666666666667e-02,
-0.75757575757575758e-02,
0.21092796092796093e-01,
-0.83333333333333333e-01,
0.4432598039215686};
xa = fabs(x);
s = 0.0;
if ((x == (int)x) && (x <= 0.0)) {
ps = 1e308;
return ps;
}
if (xa == (int)xa) {
n = xa;
for (k=1;k<n;k++) {
s += 1.0/k;
}
ps = s-el;
}
else if ((xa+0.5) == ((int)(xa+0.5))) {
n = xa-0.5;
for (k=1;k<=n;k++) {
s += 1.0/(2.0*k-1.0);
}
ps = 2.0*s-el-1.386294361119891;
}
else {
if (xa < 10.0) {
n = 10-(int)xa;
for (k=0;k<n;k++) {
s += 1.0/(xa+k);
}
xa += n;
}
x2 = 1.0/(xa*xa);
ps = log(xa)-0.5/xa+x2*(((((((a[7]*x2+a[6])*x2+a[5])*x2+
a[4])*x2+a[3])*x2+a[2])*x2+a[1])*x2+a[0]);
ps -= s;
}
if (x < 0.0)
ps = ps - M_PI*cos(M_PI*x)/sin(M_PI*x)-1.0/x;
return ps;
}
However, when applicated the codes
>digamma(-0.9)
[1] -9.312644 OK!
But when
> dyn.load("psi.so")
> out<-.C("psi", as.double(-0.9))
Erro en .C("psi", as.double(-0.9)) : C symbol name "psi" not in load table
> out
Error: objeto "out" no encontrado
More information on OS:
> version
_
platform i486-pc-linux-gnu
arch i486
os linux-gnu
system i486, linux-gnu
status
major 2
minor 4.1
year 2006
month 12
day 18
svn rev 40228
language R
version.string R version 2.4.1 (2006-12-18)
Many thanks for any insight or comments.
Bernardo Lagos A.
More information about the R-help
mailing list