I can't make .C(...) web-page example.
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