[R] Problem with C extension
Prof Brian Ripley
ripley at stats.ox.ac.uk
Fri Jan 19 18:54:49 CET 2007
[A programming question moved from R-help]
On Fri, 19 Jan 2007, Markus Schmidberger wrote:
> Hello,
>
> I try to write an extension in C, to get a faster functions.
> Therefore I have to add an element (vector) to a vector. The command in
> R is very simple: x = c(x,a)
I don't see how you are going to code this in C appreciably faster than
the R developers already have.
> But in C I have the problem to reallocate my vector for getting more
> space. Everything I tried, I get a "Segmentation fault".
We have no idea how you are trying to do this, or even which interface
(.C, .Call, .External) you are trying to use.
> So, how can I combine two vectors in C and give the result back to R
> (return(x))?
The code below is just a beginning (it does no coercion, there are missing
cases and it can be improved by caching e.g. REAL(a)), but can be used by
> dyn.load("my_c.so")
> my_c <- function(a, b) .Call("my_c", a, b)
% cat my_c.c
#include <R.h>
#include <Rinternals.h>
SEXP my_c(SEXP a, SEXP b)
{
SEXP ans;
int i, na, nb;
if(TYPEOF(a) != TYPEOF(b)) error("type mismatch");
switch(TYPEOF(a)) {
case LGLSXP:
case INTSXP:
case REALSXP:
case STRSXP:
break;
default:
error("unimplemented type");
}
na = LENGTH(a); nb = LENGTH(b);
PROTECT(ans = allocVector(TYPEOF(a), na+nb));
switch(TYPEOF(a)) {
case LGLSXP:
case INTSXP:
for(i = 0; i < na; i++) INTEGER(ans)[i] = INTEGER(a)[i];
for(i = 0; i < nb; i++) INTEGER(ans)[na+i] = INTEGER(a)[i];
break;
case REALSXP:
for(i = 0; i < na; i++) REAL(ans)[i] = REAL(a)[i];
for(i = 0; i < nb; i++) REAL(ans)[na+i] = REAL(a)[i];
break;
case STRSXP:
for(i = 0; i < na; i++) SET_STRING_ELT(ans, i, STRING_ELT(a, i));
for(i = 0; i < nb; i++) SET_STRING_ELT(ans, na+i, STRING_ELT(a, i));
break;
}
UNPROTECT(1);
return ans;
}
--
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