[R] I can't make .C(...) web-page example.

Prof Brian Ripley ripley at stats.ox.ac.uk
Sun Feb 1 18:30:16 CET 2004


On 1 Feb 2004, Peter Dalgaard wrote:

> Ricardo Zorzetto Nicoliello Vencio <rvencio at ime.usp.br> writes:
> 
> > Hi everyone!
> > 
> > I'm trying to lear how to call external C code in R but even the R help
> > web-page example is drive me crazy.
> > 
> > I copy-paste the example at:
> > 
> > http://stat.ethz.ch/R-manual/R-patched/doc/manual/R-exts.html#Interface%20functions%20.C%20and%20.Fortran
> > 
> > here is the example:
> > 
> > void convolve(double *a, int *na, double *b, int *nb, double *ab)
> > {
> >   int i, j, nab = *na + *nb - 1;
> > 
> >   for(i = 0; i < nab; i++)
> >     ab[i] = 0.0;
> >   for(i = 0; i < *na; i++)
> >     for(j = 0; j < *nb; j++)
> >       ab[i + j] += a[i] * b[j];
> > }
> > 
> > called from R by
> > 
> > conv <- function(a, b)
> >   .C("convolve",
> >      as.double(a),
> >      as.integer(length(a)),
> >      as.double(b),
> >      as.integer(length(b)),
> >      ab = double(length(a) + length(b) - 1))$ab
> > 
> > 
> > but using the conv function in simple examples give me trouble:
> > 
> > > conv(1:10,2:11)
> > Error in conv(1:10, 2:11) : pairlist object cannot be coerced to double
> > 
> > > conv( rnorm(10,10,1) , rnorm(10,11,1) )
> > Segmentation fault
> > 
> > > conv( c(10.53, 8.456, 6.6) , c(10.53, 8.456, 6.6) )
> > Error in conv(c(10.53, 8.456, 6.6), c(10.53, 8.456, 6.6)) :
> >         cannot allocate vector of length 1717986918
> > 
> > > a = c(1.46756, 5.56456, 2.3646)
> > > b = a + 5.4
> > > conv(a,b)
> > Error in conv(a, b) : cannot coerce type promise to double vector
> > 
> > 
> > and so on.
> > 
> > These results appear if I have only the .c file or if I use gcc -c conv.c
> > to create .o file. I cannot create executable because there is no
> > main(...) in .c file but just the copy-pasted example.
> > 
> > 
> > Someone knows what is happening to me ?
> 
> Looks like you haven't quite understood how to generate a shared
> library (R CMD SHLIB) and load it dynamically (dyn.load), and then
> somehow pick up a different convolve entry point (doesn't seem
> possible with Linux, but you're not tellig us what your system is...).
> Either that or you managed to confuse R badly through some earlier
> attempts to load the module.

There is an entry point convolve in package ts which is nowadays loaded by
default.  A week or so ago that one was being found under Windows even
after dynamically loading convolve.dll, so I renamed it in R-devel.  I got
the first error message listed above with that example.

If you try another name (convolve1, for example) it should either work or 
report that the symbol cannot be found, hence my suggestion to use another 
name.

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595




More information about the R-help mailing list