Comment appeler la fonction C depuis R?

Comment utiliser une fonction écrite en C à partir du niveau R en utilisant des données R. par exemple. utiliser une fonction comme:

double* addOneToVector(int n, const double* vector) { double* ans = malloc(sizeof(double)*n); for (int i = 0; i < n; ++i) ans[i] = vector[i] + 1 return ans; } 

dans le cadre:

 x = 1:3 x = addOneToVector(x) x # 2, 3, 4 

J’ai d’abord fait une recherche sur stackoverflow mais j’ai remarqué qu’il n’y avait pas de réponse à cela ici.
L’idée générale est (commandes pour Linux, mais même idée sous un autre système d’exploitation):

  1. Créez une fonction qui prend uniquement des pointeurs sur les types de base et fait tout par effets secondaires (retourne void). par exemple:

     void addOneToVector(int* n, double* vector) { for (int i = 0; i < *n; ++i) vector[i] += 1.0; } 
  2. Comstackz le fichier source C en tant que bibliothèque dynamic, vous pouvez utiliser le raccourci R pour le faire:

     $ R CMD SHLIB lib.c 
  3. Charger la bibliothèque dynamic à partir de R:

     dyn.load("foo.so") 
  4. Appelez les fonctions C à l'aide de la fonction .C , IE:

     x = 1:3 ret_val = .C("addOneToVector", n=length(x), vector=as.double(x)) 

Il renvoie la liste à partir de laquelle vous pouvez obtenir la valeur des entrées après avoir appelé des fonctions

 ret_val$x # 2, 3, 4 

Vous pouvez maintenant l’envelopper pour pouvoir l’utiliser de R plus facilement.

Il y a une belle page décrivant l'ensemble du processus avec plus de détails ici (couvrant également Fortran):

http://users.stat.umn.edu/~geyer/rc/