У меня есть следующая C функция callThisFromR.c
, которую я хочу вызвать из языка R,
#include <stdio.h>
#include <stdint.h>
#include <string.h>
void callThisFromR (
// some integer
int32_t integerFromR, // this is the length of the double vector `vec` to be passed again to R
// This is the R function passed to C: `getFuncFromR(vecLen, vec)`
double (* getFuncFromR) (
int32_t ,
double []
),
char inputString[] ,
int32_t inputStringLen
) {
printf("This is the integer passed from R: %d\n", integerFromR);
printf("This is the string passed from R: %s\n", inputString);
printf("This is the string length passed from R: %d\n", inputStringLen);
// Generate some double data to pass to R
double *vec;
vec = (double *) malloc( integerFromR * sizeof(*vec) );
for( int i=0; i<integerFromR; i++ ) {
vec[i] = (double) (i+1);
}
double result = getFuncFromR(integerFromR,vec);
printf("This is the result of the R callback function passed from R: %f\n", result );
}
Эта C функция должна вызываться изнутри R и ожидает получения int32
целое число integerFromR
, строка inputString
и ее длина inputStringLen
, а также функция обратного вызова getFuncFromR
из R. Например, здесь main.c
C -эквивалент того, что я нужно иметь в R,
#include <stdio.h>
#include <stdint.h>
#include <string.h>
double getFuncFromR (
int32_t vecLen,
double vec[]
)
{
double vecSum = 0.;
for(int i = 0; i < vecLen; i++){
vecSum += vec[i];
}
return vecSum;
}
int main(int argc, char *argv[])
{
char inputString[] = "ThisIsTheStringPassedFromR2C";
int32_t inputStringLen = strlen(inputString);
int32_t integerFromR = 3;
callThisFromR( integerFromR
, &getFuncFromR
, inputString
, inputStringLen
);
return 0;
}
Легко в C. Но вызвать callThisFromR()
C -функцию из R и передать функцию R getFuncFromR()
до сих пор было похоже на кошмар. Как я могу написать функцию оболочки C? Мой исчерпывающий поиск в сети (включая документацию по R-1023 * и R-Foreign-Language-Extension) ни к чему не привел.