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):
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; }
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
Charger la bibliothèque dynamic à partir de R:
dyn.load("foo.so")
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):