2015-06-20 17 views

risposta

2

Credo che dovresti guardare RFortran? AFAIK è l'unico vincolo di Fortran degli oggetti R, in più è open source.

EDIT

Come per i commenti qui sotto, ero ignaro che RFortran era applicabile solo su Windows. Quindi, per una risposta più portabile creiamo un esempio in cui sfrutterò lo RInside che semplifica l'integrazione delle funzioni R in codice C++. Vorrei anche utilizzare il iso_c_binding per interfacciarsi con C.

testC.cpp

#include <iostream> 
#include <RInside.h>      

void helloR_(int argc, char *argv[], const char *msg); 

extern "C" void helloR(int argc, char *argv[], const char *msg) { 

    // create an embedded R instance 
    RInside R(argc, argv);    

    // convert to string for RInside assignment 
    std::string txt = std::string(msg); 

    // C++ Notice 
    std::cout << "This is C++, " << txt << std::endl; 

    // Assign string to R object 
    R.assign(txt, "txt"); 

    // eval the string, give R notice 
    R.parseEvalQ("cat('This is R, ', txt, '\n')"); 
} 

testF.f

PROGRAM MAIN 
    USE iso_c_binding 
    IMPLICIT NONE 
    INTEGER :: argc 
    CHARACTER(len=32) :: arg 
    CHARACTER(len=32) :: msg 

    INTERFACE 
     SUBROUTINE R_FUN(argc, arg, msg) bind(C, name="helloR") 
     USE iso_c_binding 
     INTEGER(kind=c_int), INTENT(IN) :: argc 
     CHARACTER(kind=c_char), INTENT(IN) :: arg(*) 
     CHARACTER(kind = C_CHAR), INTENT(IN) :: msg(*) 
     END SUBROUTINE R_FUN 
    END INTERFACE 

    print *, "Fortran Calling RInside" 
    CALL R_FUN (argc, arg, "Hello World"//C_NULL_CHAR) 

    END PROGRAM 

La compilazione Fortran è semplice:

gfortran -c testF.f 

Il C++ la compilazione è un po 'complicata dato che devi sapere dove sono le directory di inclusione R, Rcpp e RInside si trovano.

g++ testC.cpp -c -I/path/to/RInside/include -I/path/to/Rcpp/include -I/usr/share/R/include 

Poi il collegamento è necessario fornire le librerie corrette e la bandiera lgfortran.

g++ -o fcr testF.o testC.o -L/usr/lib/R/lib -lR -L/path/to/RInside/lib/ -lRInside -L/path/to/Rcpp/libs/ -Wl,-rpath,/home/path/to/RInside/lib/ -lRInside -Wl,-rpath,/path/to/Rcpp/libs/ -lgfortran 

Ora ho un piccolo programma che dimostra come accedere formare funzioni R Fortran

./fcr 
Fortran Calling RInside 
This is C++, Hello World 
This is R, Hello World 
+1

"COM è una tecnologia Microsoft, per questo motivo si è limitati a utilizzarlo solo su piattaforme Windows, anche se R esiste per Linux e altre piattaforme, non sarà possibile utilizzare RFortran su queste piattaforme poiché l'interfaccia COM non è presente. " –

+1

COM è molto brutto, probabilmente è meglio interfacciare semplicemente Rcpp da Fortran. –

1

una soluzione generale è quello di scrivere i dati in un file da un programma Fortran, chiamare EXECUTE_COMMAND_LINE (standard Fortran 2003) o qualcosa come SYSTEM (un'estensione comune) per chiamare uno script R che scrive i risultati su un file e quindi per leggere quei risultati dal programma Fortran.

Poiché R è software libero ed è scritto in R, C e Fortran, può essere possibile tradurre il codice R in Fortran (entrambi sono linguaggi di array) o chiamare il codice C o Fortran direttamente dal programma Fortran.

Altrimenti, indagare è meglio chiamare Fortran (o C) da R come si troveranno molte più informazioni su questo approccio. Il sistema per farlo è abbastanza ben definito. Potrebbe essere che si possa fare il contrario, ma alcune cose devono essere inizializzate affinché R funzioni.

Problemi correlati