Det här svaret kommer att täcka installation av RODBC och ROracle på OS X, specifikt på Mavericks och senare.
Båda paketen måste nu byggas (kompileras) från källkod. Det betyder att det första du behöver är att ladda ner XCode och de tillhörande "kommandoradsverktygen" så att du faktiskt har en kompilator. Hur du gör detta har förändrats med i princip alla versioner av OS X/XCode, men om du börjar Googla kommer du förmodligen att landa här.
När du väl har det på plats...
RODBC
Sedan OS X 10.9 (Mavericks) slutade Apple att inkludera iODBC SQL-huvudfilerna tillsammans med "kommandoradsverktygen" som R-användare på OS X är vana vid att installera för att bygga R-paket från källkod.
Så om du försöker bygga RODBC från källan på Mavericks vid det här laget bör du få ett felmeddelande som:
configure:error:"ODBC-huvuden sql.h och sqlext.h hittades inte"
För att fixa detta måste du ladda ner den senaste versionen av iODBC (www.iodbc.org), och sedan packa upp filen och ställa in din rubrik och bibliotekssökväg till platsen där du placerade det uppackade paketet. Om du inte vet hur du ställer in dina sökvägar kan du bara lägga in rubrikfilerna (sql.h och sqlext.h) i /usr/include
katalogen och libiodbc.a
filen i /usr/lib
katalog.
Då borde du kunna göra
install.packages("RODBC",type = "source")
utan problem. Förmodligen skulle detta fungera lika bra med det andra stora ODBC-projektet med öppen källkod, unixODBC, men jag har inte provat det.
Jag har testat detta (och hembryggningsmetoden i ett annat svar) på El Capitan och båda fungerar fortfarande.
ROracle
Det här är mer komplicerat. ROracle kan dock installeras på OS X (jag har testat detta på Mountain Lion genom El Capitan). Eftersom ROracle förlitar sig på Oracle Instant Client, finns det inga binärfiler tillgängliga på någon plattform. Det finns detaljerade installationsinstruktioner för paketet här.
För OS X måste vi (för det mesta) följa Linux-instruktionerna.
Ladda först ner lämplig Oracle Instant Client, såväl som SDK, enligt instruktionerna i Linuz-instruktionerna.
Linux-installationsinstruktionerna nämner installation av klienten från en RPM, vilket kommer att placera allt "på rätt plats". Jag kunde inte ta reda på om det ens gällde för OS X, så jag packade helt enkelt upp klienten i en katalog som jag skapade och placerade SDK:n i den katalogen i /sdk
.
Linux-installationsinstruktionerna uppmanar oss sedan att skapa en symbolisk länk för libclntsh.so.11.1. Eftersom detta är OS X, heter det faktiskt libclntsh.dylib.11.1. Så vi måste cd till katalogen där vi packade upp klienten och kör sedan
ln -s libclntsh.dylib.11.1 libclntsh.dylib
På OS X ställer vi sedan in DYLD_LIBRARY_PATH
, inte LD_LIBRARY_PATH
:
export DYLD_LIBRARY_PATH=/scratch/instantclient_11_2:$DYLD_LIBRARY_PATH
använda den sökväg som är korrekt för din maskin.
Jag kunde aldrig få ROracle att kompilera med en OCI_LIB
miljöfaktor. Istället använde jag --with-oci-lib
kompilatorflaggaalternativ:
R CMD INSTALL --configure-args='--with-oci-lib=/scratch/instantclient_11_2' ROracle_1.1-11.tar.gz
igen genom att använda vilken sökväg och ROracle-versionsnummer som är lämpligt.
Om du ansluter till en Oracle-databas med en tnsnames.ora-fil, måste du också ställa in en TNS_ADMIN miljövariabel för att peka på platsen för den filen.
En sista gotcha:du kanske upptäcker (som jag gjorde) att allt detta fungerar bara om du startar Rfrån kommandoraden (dvs Terminal). Specifikt, om du startar antingen RGui.app eller RStudio.app från GUI och sedan försöker köra library(ROracle)
du kommer att få ett felmeddelande som säger något till effekten av
> 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’
Detta kommer att hända även om Sys.getenv("DYLD_LIBRARY_PATH")
rapporterar troget den korrekta vägen.
Ett tag hackade jag ihop en "lösning" där jag skapade ett skalskript som startade RStudio/RGui vid uppstart, och var bara tvungen att komma ihåg att alltid i efterhand starta dem via
open -a R.app
open -a RStudio.app
Problemet har tydligen att göra med hur miljövariabler görs tillgängliga för GUI-lanserade applikationer i OS X. Som vanligtvis är fallet hittade jag så småningom lösningen på StackOverflow. Redigera /etc/launchd.conf
filen löste det här problemet, så ROracle laddas nu även när RStudio/RGuiare startas från Finder. Observera dock här att /etc/launchd.conf
lösningen stöds inte längre i Yosemite. Det svaret antyder att du nu behöver konfigurera en start-plist-fil bara för att ställa in miljön för launchctl
vid start.
El Capitan-uppdatering för ROracle
Jag har nu gått igenom degeln på den här i El Capitan och den fungerar enligt beskrivningen ovan, men bara om du inaktiverar System Integrity Protection först! Att göra det går ganska snabbt och instruktionerna är lätta att hitta via Google.
Puh.