Questa risposta riguarderà l'installazione di RODBC e ROracle su OS X, in particolare su Mavericks e versioni successive.
Entrambi i pacchetti ora devono essere compilati (compilati) dal sorgente. Ciò significa che la prima cosa di cui hai bisogno è scaricare XCode e gli "strumenti da riga di comando" associati in modo da avere un compilatore. Il modo in cui lo fai è cambiato praticamente con ogni versione di OS X/XCode, ma se inizi a cercare su Google probabilmente finirai per arrivare qui.
Una volta che l'hai a posto...
RODBC
Da quando OS X 10.9 (Mavericks) Apple ha smesso di includere i file di intestazione SQL di iODBC insieme agli "strumenti da riga di comando" che gli utenti R su OS X sono abituati a installare per creare Rpackage dal sorgente.
Quindi, se provi a compilare RODBC dal sorgente su Mavericks a questo punto dovresti ricevere un errore del tipo:
configure:error:"Intestazioni ODBC sql.h e sqlext.h non trovate"
Per risolvere il problema, devi scaricare l'ultima versione di iODBC (www.iodbc.org), quindi decomprimere il file e impostare i percorsi di ricerca dell'intestazione e della libreria nella posizione in cui hai inserito il pacchetto decompresso. Se non sai come impostare i tuoi percorsi di ricerca, puoi semplicemente inserire i file di intestazione (sql.h e sqlext.h) in /usr/include
directory e il libiodbc.a
file nel /usr/lib
directory.
Allora dovresti essere in grado di farlo
install.packages("RODBC",type = "source")
senza alcun problema. Presumibilmente questo funzionerebbe anche con l'altro importante progetto ODBC open source, unixODBC, ma non l'ho provato.
Ho testato questo (e il metodo homebrew in un'altra risposta) su El Capitan ed entrambi funzionano ancora.
ROracle
Questo è più complicato. Tuttavia, ROracle può essere installato su OS X (l'ho testato su Mountain Lion tramite El Capitan). Poiché ROracle si basa su Oracle Instant Client, non sono disponibili file binari per nessuna piattaforma. Ci sono istruzioni dettagliate per l'installazione del pacchetto qui.
Per OS X, dobbiamo (principalmente) seguire le istruzioni di Linux.
Innanzitutto, scarica l'appropriato Oracle Instant Client, nonché l'SDK, come indicato nelle istruzioni di Linuz.
Le istruzioni di installazione di Linux menzionano l'installazione del client da un RPM, che posizionerà tutto "nel posto giusto". Non sono riuscito a capire se si applicasse anche a OS X, quindi ho semplicemente decompresso il client in una directory che ho creato e ho inserito l'SDK all'interno di quella directory in /sdk
.
Le istruzioni di installazione di Linux ci indirizzano quindi a creare un collegamento simbolico per libclntsh.so.11.1. Poiché questo è OS X, in realtà si chiama libclntsh.dylib.11.1. Quindi abbiamo bisogno di cd nella directory in cui abbiamo decompresso il client e quindi eseguiamo
ln -s libclntsh.dylib.11.1 libclntsh.dylib
Su OS X, impostiamo quindi il DYLD_LIBRARY_PATH
, non il LD_LIBRARY_PATH
:
export DYLD_LIBRARY_PATH=/scratch/instantclient_11_2:$DYLD_LIBRARY_PATH
utilizzando il percorso corretto per la tua macchina.
Non sono mai riuscito a far compilare ROracle con un OCI_LIB
variabile d'ambiente. Invece, ho usato --with-oci-lib
opzione flag del compilatore:
R CMD INSTALL --configure-args='--with-oci-lib=/scratch/instantclient_11_2' ROracle_1.1-11.tar.gz
utilizzando di nuovo il percorso e il numero di versione di ROracle appropriato.
Se ti stai connettendo a un database Oracle utilizzando un file tnsnames.ora, dovrai anche impostare una variabile di ambiente TNS_ADMIN in modo che punti alla posizione di quel file.
Un ultimo trucco:potresti scoprire (come ho fatto io) che tutto funzionerà solo se avvii R dalla riga di comando (es. Terminale). In particolare, se avvii RGui.app o RStudio.app dalla GUI e quindi provi a eseguire library(ROracle)
riceverai un errore dicendo qualcosa che ha l'effetto di
> library("ROracle")
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/Library/Frameworks/R.framework/Versions/3.1/Resources/library/ROracle/libs/ROracle.so':
dlopen(/Library/Frameworks/R.framework/Versions/3.1/Resources/library/ROracle/libs/ROracle.so, 6): Library not loaded: /ade/b/3071542110/oracle/rdbms/lib/libclntsh.dylib.11.1
Referenced from: /Library/Frameworks/R.framework/Versions/3.1/Resources/library/ROracle/libs/ROracle.so
Reason: image not found
Error: package or namespace load failed for ‘ROracle’
Ciò accadrà anche se Sys.getenv("DYLD_LIBRARY_PATH")
riporta fedelmente il percorso corretto.
Per un po', ho messo insieme una "soluzione" in cui ho creato uno script di shell che avviava RStudio/RGui all'avvio e dovevo solo ricordarmi di avviarli sempre successivamente tramite
open -a R.app
open -a RStudio.app
Apparentemente il problema ha a che fare con il modo in cui le variabili di ambiente sono rese disponibili per le applicazioni avviate dalla GUI in OS X. Come di solito accade, alla fine ho trovato la soluzione su StackOverflow. Modifica di /etc/launchd.conf
ha risolto questo problema, quindi ROracle ora viene caricato anche quando RStudio/RGuiare viene avviato dal Finder. Tuttavia, nota qui che /etc/launchd.conf
soluzione non è più supportata in Yosemite. Questa risposta suggerisce che ora è necessario configurare un file plist di avvio solo per impostare l'ambiente per launchctl
all'avvio.
Aggiornamento El Capitan per ROracle
Ora ho esaminato il crogiolo su questo in El Capitan e funziona come descritto sopra, ma solo se disabilita la protezione dell'integrità del sistema primo! Farlo è abbastanza veloce e le istruzioni sono facilmente reperibili tramite Google.
Uff.