Обратный вызов функции R от C - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть следующая 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) ни к чему не привел.

...