2011-03-02 4 views
28

Je ne suis pas à l'aise lorsque je commence à chercher des scripts de configuration. Je ne suis pas sûr comment créer un paquet R qui a plusieurs fonctions construites à partir de C/C++ de telle sorte qu'il est portable entre Windows & Linux. Mes tentatives pour modifier le courage des paquets existants ont été infructueuses.où est un bon tutoriel sur la création d'un paquet R avec du code source C++?

Une aide ou des liens seraient grandement appréciés.

Mise à jour: Si possible Je voudrais créer un lien contre: Boost, CUDA, & hwloc

Cependant, je me rends compte que Boost sera un cauchemar & hwloc ne sera pas beaucoup mieux . Donc je me contenterais de CUDA. C'est pourquoi j'ai plongé dans la partie profonde et essayé de modifier certains paquets existants pour répondre à mes besoins (régler & rglpk). Mais je suis prêt à commencer sans dépendances et à construire à partir de zéro. Merci à tous pour vos suggestions !!

+1

Il serait utile que vous nous disiez ce qui est insuffisant au sujet des manuels fournis avec votre installation R. –

+2

J'ai lu "Writing R Extensions". Je me perds assez rapidement dans la section 1.2. Mon code C++ a un Makefile, mais ce n'est pas portable. Donc, j'aimerais utiliser la fonctionnalité Makevars.in et configurer, mais je ne sais pas comment procéder. Existe-t-il un exemple facilement compréhensible quelque part avec, disons, deux fichiers source C++, trois fichiers d'en-tête et un code R qui est tout enveloppé dans un paquet R? –

+0

Habituellement, un script configure n'est nécessaire que si vous effectuez une liaison avec une bibliothèque externe non fournie par R. Si vous faites cela, il serait utile de nous indiquer quelles bibliothèques externes vous essayez d'utiliser. – Sharpie

Répondre

22

J'étais également tout à fait perdu en écrivant mon premier paquet avec le code compilé. Voici quelques conseils, mais il y a probablement de meilleurs matériaux.

La pièce maîtresse à propos de l'écriture des packages R est "Writing R extensions". Ceci est un guide très complet, mais qui fait aussi abit difficile à lire: http://cran.r-project.org/doc/manuals/R-exts.pdf

Voici un petit tutoriel j'ai trouvé sur google une fois que j'ai utilisé d'abord, contenant comment utiliser du code C: http://www.stat.columbia.edu/~gelman/stuff_for_blog/AlanRPackageTutorial.pdf

un autre guide sur les paquets de R en général, mais pas avec le code C: http://cran.r-project.org/doc/contrib/Leisch-CreatingPackages.pdf

Rcpp est très utile pour package code C++, mais je l'ai pas utilisé beaucoup encore (3 jours en fait). Il a beaucoup de documentation dans le paquet lui-même.

+0

Cela a également été utile: http://www.biostat.jhsph.edu/~rpeng/docs/interface.pdf – MichaelChirico

15

Mon approche par défaut est d'apprendre comment les autres ont résolu le problème. Il y a 2800+ paquets CRAN, et beaucoup sont là depuis plus d'une décennie. Le problème est résolu, et a été résolu.

Maintenant, il est également vrai que la documentation est là, mais peut-être trop dispersée. De plus, les cibles changent. Par exemple, il y a des années, nous utilisions encore src/Makefile, ces jours-ci, il est fortement recommandé contre en raison du besoin de versions multiarchitecture (sur OS X, sur Windows, et un jour aussi sur Linux).

Essayer de rester simple, ça aide. Vous pouvez en effet avoir un projet C++ valide ... sans rien. Il suffit de déposer les fichiers sources dans src/ de votre paquet foo, et R saura comment construire libfoo.so ou libfoo.dylib ou ..., en fonction de la plate-forme. Et si vous avez besoin d'autres fichiers d'en-tête, essayez d'utiliser src/Makevars. Pour les dépendances externes, cela devient plus compliqué et il faut apprendre quoi que ce soit autoconf et autres, mais beaucoup de paquets patinent avec quelque chose de simple. Alors s'il vous plaît ne développez votre question, montrez ce qui échoue et documentez ce que vous avez essayé. Je suis sûr que nous pouvons vous aider.

Edit: Et si vous voulez cela avec le paquet Rcpp (qui aide avec R et intégration C++), alors il y a une entire vignette about to do this in your own package.

Édition 2: Maintenant que vous avez élargi votre question, CUDA est une bête complètement différente. C'est plus difficile quand vous mélangez différents compilateurs etc. pp. Il y a deux exemples de paquets sur CRAN, étudiez ceux-là.

+0

Si je suis prêt à envelopper mon code C++ avec des fonctions C, alors je n'aurais pas besoin d'utiliser Rcpp le ferais-je? –

+0

Non, mais Rcpp est là pour aider plutôt que d'entraver. Beaucoup d'entre nous pensent que cela facilite les choses en * vous libérant de l'obligation d'écrire des enveloppes répétitives *. Regardez quelques-uns des exemples, vous pouvez l'aimer. Mais pour réitérer: vous n'avez * pas * besoin d'un 'src/Makevars' si votre projet est simple, et vous n'avez * pas * à utiliser Rcpp. Mais certains d'entre nous pensent que cela aide :) –

+0

Merci beaucoup pour la perspicacité! Je vérifierai. –