[R-es] .C interface
José Luis Cañadas
canadasreche en gmail.com
Vie Dic 2 10:57:26 CET 2011
Hola a todos.
Lo primero de todo.
No tengo ni idea de C pero estoy intentando compilar un pequeño trozo de
código simple para poder usar luego esa función dentro de R.
Estaba viendo el documento .C interface y viendo el ejemplo de las
convoluciones, y si me sale.
el ejemplo es el siguiente.
#### códido en C ####
#include <R.h>
void cconv(int *l,double *x,int *n,double *s)
{
double *y = x + (*n - *l), *z = x + *l , *u = x;
while (u < y)
*s += *u++ * *z++;
}
######################
Luego en la terminal de linux, ejecuto
R CMD SHLIB cconv.c
para compilar
Ya estaría disponible para R de forma que al ejecutar
dyn.load("cconv.so")
rconv <- function(lag,x) {
.C("cconv",as.integer(lag),
as.double(x),
as.integer(length(x)),
as.double(0.0))[[4]]
}
Mi problema es que tengo un código C (generado por de esta forma
/*--- start generated code ---*/
#include <math.h>
#include <string.h>
#include <memory.h>
#include <ctype.h>
#include "cscore.h"
#include "csparm.h"
#define csNIQUIST indata[9].data.fnum
#define csGRP_NIQUIST outdata[13].data.fnum
#define csWOE_NIQUIST outdata[52].data.fnum
/*------------------------------------------------------------**/
/* variable: niquist*/
/*------------------------------------------------------------**/
if ( missingn(csNIQUIST))
{
csGRP_NIQUIST = 2.0;
csWOE_NIQUIST = -0.025041389;
}
else if (! missingn(csNIQUIST))
{
if ( csNIQUIST < -135887.86)
{
csGRP_NIQUIST = 1.0;
csWOE_NIQUIST = -0.469640449;
}
else if ( -135887.86 <= csNIQUIST && csNIQUIST < -3826.96)
{
csGRP_NIQUIST = 2.0;
csWOE_NIQUIST = -0.025041389;
}
else if ( -3826.96 <= csNIQUIST)
{
csGRP_NIQUIST = 3.0;
csWOE_NIQUIST = 0.0659986919;
}
}
Pero no tengo ni idea de como ponerlo en forma de void nombre_funcion( )
Me suena que en las jornadas se habló de que era posible usar código C
en R .
¿alguna idea, o me pongo a estudiar un poco de C directamente???
Gracias y un saludo
Más información sobre la lista de distribución R-help-es