2010-09-09 9 views
5

Lavorando in Windows, ho creato un pacchetto r che si collega a una DLL C++ come libreria condivisa. Funziona bene e si installa senza problemi su Windows. Quando passo a Linux, tuttavia, il modo non viene trovato.Creazione di un pacchetto r con una dll C++ in windows e garanzia della portabilità su linux

Ho ragione nel pensare che l'unico file nella directory src dovrebbe essere il file .cpp?

È necessario eseguire il comando SHLIB in tale directory prima di creare il pacchetto?

nello spazio dei nomi che uso:

useDynLib(myc.cpp,my.c.function) 

e nella chiamata di funzione:

my.r.f <- .Call(my.c.function, a, b) 

Su Windows in esecuzione di controllo R CMD funziona bene. Potrebbe essere la mia configurazione R linux che è la colpa? Sembra installare bene i pacchetti di terze parti.

Sono perplesso!

+0

Non so se troverai una risposta qui, mi piacerebbe andare alla mailinglist r-develop: [email protected] Se ottieni una risposta, ti piacerebbe postarla qui come bene? Questo è molto interessante per me e chiunque altro stia scrivendo pacchetti. –

+3

@Joris L'unico problema è che Dirk Eddelbuettel a volte dorme ;-) – mbq

risposta

1

Penso che dovresti usare solo useDynLib(myc) ... La ricerca dei simboli viene eseguita internamente.
EDIT: L'altra cosa è il nome di questo file oggetto - Penso che il makefile standard lo chiami solo con il nome del pacchetto, quindi dovrebbe essere piuttosto useDynLib(<package name>). Almeno funziona sempre per me.

+0

Aggiungere 'PACKAGE =" my.package.name "' a ogni '.Call' eviterà la ricerca di simboli per ogni chiamata di funzione. –

+0

Sei sicuro? Ho pensato che fosse solo per evitare conflitti di nome, mentre R ottimizza la ricerca con un dizionario che viene aggiornato a seconda delle stranezze della piattaforma e degli argomenti di dyn.load. Ma non ne sono affatto sicuro. – mbq

+0

"symbol lookup" è probabilmente la frase sbagliata.Non ricordo il comportamento esatto, ma incluso l'argomento 'PACKAGE' ha impedito una ricerca che aumentava drasticamente la velocità delle chiamate ripetute a' .Call'. Potrebbe essere stato 'getCallingDLL' o' getDLLRegisteredRoutines' ... –

2

Ci sono diverse centinaia di pacchetti su CRAN che eseguono con successo ciò che si tenta di fare: creare un pacchetto con origini da compilare su qualsiasi piattaforma supportata.

Una strategia che mi piace è quella di prendere uno o più pacchetti esistenti e osservare esattamente come sono impostati. Puoi quindi copiare la ricetta di lavoro a seconda di come corrisponde alla tua configurazione (con o senza NAMESPACE, con o senza libreria esterna come libxml ecc pp_)

1

Ho preso il consiglio di Dirk e ho sfogliato alcuni pacchetti su CRAN.

Un approccio comune sembra essere quello di utilizzare useDynLib (nome_pacchetto) come suggerito da mbq nel file NAMESPACE. Ho quindi utilizzato la chiamata:

.Call("my.c.function", a, b, package="package_name") 

nel codice R come suggerito da Joshua.

Ora installa e funziona bene su Linux e Windows :-)

Penso che presto passare alla Rcpp come in-R strumenti di compilazione e di compilazione di pacchetti scheletro sembrano molto allettante.

Grazie a tutti!

Problemi correlati