R from C — Simplest Possible Helloworld

后端 未结 4 1890
甜味超标
甜味超标 2020-11-30 00:47

What is the simplest possible C function for starting the R interpreter, passing in a small expression (eg, 2+2), and getting out the result? I\'m trying to compile with Mi

4条回答
  •  日久生厌
    2020-11-30 01:32

    I don't think any of the above has answered the question - which was to evaluate 2 + 2 ;). To use a string expression would be something like:

    #include 
    #include 
    #include 
    
    int main(int argc, char **argv) {
        SEXP x;
        ParseStatus status;
        const char* expr = "2 + 2";
    
        Rf_initEmbeddedR(argc, argv);
    
        x = R_ParseVector(mkString(expr), 1, &status, R_NilValue);
        if (TYPEOF(x) == EXPRSXP) { /* parse returns an expr vector, you want the first */
            x = eval(VECTOR_ELT(x, 0), R_GlobalEnv);
            PrintValue(x);
        }
    
        Rf_endEmbeddedR(0);
    
        return 0;
    }
    

    This lacks error checking, obviously, but works:

    Z:\>gcc -o e.exe e.c -IC:/PROGRA~1/R/R-213~1.0/include -LC:/PROGRA~1/R/R-213~1.0/bin/i386 -lR
    Z:\>R CMD e.exe
    [1] 4
    

    (To get the proper commands for your R use R CMD SHLIB e.c which gives you the relevant compiler flags)

    You can also construct the expression by hand if it's simple enough - e.g., for rnorm(10) you would use

    SEXP rnorm = install("rnorm");
    SEXP x = eval(lang2(rnorm, ScalarInteger(10)), R_GlobalEnv);
    

提交回复
热议问题