Câu trả lời này sẽ đề cập đến việc cài đặt RODBC và ROracle trên OS X, cụ thể là trên Mavericks trở lên.
Cả hai gói bây giờ cần được xây dựng (biên dịch) từ nguồn. Điều này có nghĩa là điều đầu tiên bạn cần là tải xuống XCode và "công cụ dòng lệnh" được liên kết để bạn thực sự có một trình biên dịch. Cách bạn thực hiện điều này đã thay đổi về cơ bản với mọi phiên bản OS X / XCode, nhưng nếu bạn bắt đầu sử dụng Google, bạn có thể sẽ kết thúc ở đây.
Khi bạn đã có sẵn điều đó ...
RODBC
Kể từ khi OS X 10.9 (Mavericks), Apple đã ngừng bao gồm các tệp tiêu đề iODBC SQL cùng với "công cụ dòng lệnh" mà người dùng R trên OS X quen cài đặt để tạo các gói Rpack từ nguồn.
Vì vậy, nếu bạn cố gắng tạo RODBC từ nguồn trên Mavericks tại thời điểm này, bạn sẽ gặp lỗi như:
config:error:"Không tìm thấy tiêu đề ODBC sql.h và sqlext.h"
Để khắc phục điều này, bạn cần tải xuống phiên bản iODBC mới nhất (www.iodbc.org), sau đó giải nén tệp và đặt tiêu đề và đường dẫn tìm kiếm thư viện của bạn ở vị trí bạn đặt gói đã giải nén. Nếu bạn không biết cách đặt đường dẫn tìm kiếm của mình, bạn có thể chỉ cần đặt các tệp tiêu đề (sql.h và sqlext.h) trong /usr/include
thư mục và libiodbc.a
tệp trong /usr/lib
thư mục.
Sau đó, bạn sẽ có thể làm
install.packages("RODBC",type = "source")
mà không có bất kỳ vấn đề. Có lẽ điều này cũng sẽ hoạt động tốt với dự án ODBC nguồn mở lớn khác, unixODBC, nhưng tôi chưa thử điều đó.
Tôi đã thử nghiệm điều này (và phương pháp homebrew trong một câu trả lời khác) trên El Capitan và cả hai vẫn hoạt động.
ROracle
Điều này phức tạp hơn. Tuy nhiên, ROracle có thể được cài đặt trên OS X (Tôi đã thử nghiệm điều này trên Mountain Lion thông qua El Capitan). Vì ROracle dựa trên Oracle Instant Client nên không có nền tảng forany nào có sẵn mã nhị phân. Có hướng dẫn cài đặt chi tiết cho gói tại đây.
Đối với OS X, chúng ta cần (hầu hết) làm theo hướng dẫn của Linux.
Trước tiên, hãy tải xuống Ứng dụng khách tức thì của Oracle thích hợp, cũng như SDK, theo chỉ dẫn trong hướng dẫn Linuz.
Hướng dẫn cài đặt Linux đề cập đến việc cài đặt ứng dụng khách từ RPM, điều này sẽ đặt mọi thứ "vào đúng vị trí". Tôi không thể tìm ra liệu điều đó có áp dụng cho OS X hay không, vì vậy tôi chỉ cần giải nén ứng dụng khách trong thư mục tôi đã tạo và đặt SDK bên trong thư mục đó trong /sdk
.
Sau đó, hướng dẫn cài đặt Linux sẽ hướng dẫn chúng tôi tạo một liên kết tượng trưng cho libclntsh.so.11.1. Vì đây là OS X nên nó thực sự được gọi là libclntsh.dylib.11.1. Vì vậy, chúng tôi cần phải cd vào thư mục mà chúng tôi đã giải nén ứng dụng khách và sau đó chạy
ln -s libclntsh.dylib.11.1 libclntsh.dylib
Trên OS X, sau đó chúng tôi đặt DYLD_LIBRARY_PATH
, không phải LD_LIBRARY_PATH
:
export DYLD_LIBRARY_PATH=/scratch/instantclient_11_2:$DYLD_LIBRARY_PATH
sử dụng bất kỳ đường dẫn nào phù hợp với máy của bạn.
Tôi không bao giờ có thể sử dụng ROracle để biên dịch với OCI_LIB
biến môi trường. Thay vào đó, tôi đã sử dụng --with-oci-lib
tùy chọn cờ trình biên dịch:
R CMD INSTALL --configure-args='--with-oci-lib=/scratch/instantclient_11_2' ROracle_1.1-11.tar.gz
lại sử dụng bất kỳ đường dẫn nào và số phiên bản ROracle thích hợp.
Nếu bạn đang kết nối với cơ sở dữ liệu Oracle bằng tệp tnsnames.ora, bạn cũng cần đặt một biến môi trường TNS_ADMIN để trỏ đến vị trí của tệp đó.
Một bí quyết cuối cùng:bạn có thể thấy (như tôi đã làm) rằng tất cả điều này sẽ chỉ hoạt động nếu bạn khởi chạy Rf từ dòng lệnh (tức là Terminal). Cụ thể, nếu bạn khởi chạy RGui.app hoặcRStudio.app từ GUI, rồi thử chạy library(ROracle)
bạn sẽ nhận được một sai sót khi xử lý một cái gì đó do ảnh hưởng của
> 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’
Điều này sẽ xảy ra ngay cả khi Sys.getenv("DYLD_LIBRARY_PATH")
trung thực báo cáo đường dẫn chính xác.
Trong một thời gian, tôi đã hack cùng một "giải pháp" trong đó tôi tạo một tập lệnh shell khởi chạyRStudio / RGui khi khởi động và chỉ cần nhớ luôn khởi chạy chúng sau đó qua
open -a R.app
open -a RStudio.app
Vấn đề rõ ràng là liên quan đến cách các biến môi trường được tạo sẵn cho các ứng dụng khởi chạy GUI trong OS X. Như thường lệ, cuối cùng tôi đã tìm thấy giải pháp trên StackOverflow. Chỉnh sửa /etc/launchd.conf
tệp đã giải quyết vấn đề này, vì vậy ROracle hiện tải ngay cả khi khởi chạy RStudio / RGuiare từ Finder. Mặc dù lưu ý ở đây rằng /etc/launchd.conf
giải pháp không còn được hỗ trợ trong Yosemite. Câu trả lời đó gợi ý rằng bây giờ bạn cần thiết lập một tệp plist khởi động chỉ để thiết lập môi trường cho launchctl
khi khởi động.
Cập nhật El Capitan cho ROracle
Bây giờ tôi đã xem xét kỹ thuật nấu ăn trên cái này ở El Capitan và nó hoạt động như được mô tả ở trên, nhưng chỉ khi bạn tắt tính năng Bảo vệ toàn vẹn hệ thống Đầu tiên! Việc đó diễn ra khá nhanh chóng và bạn có thể dễ dàng tìm thấy hướng dẫn qua Google.
Phù.