2010-09-09 14 views
5

Làm việc trong Windows, tôi đã tạo một gói r liên kết tới một dll C++ làm thư viện dùng chung. Điều này làm việc tốt và cài đặt mà không có vấn đề trên Windows. Khi tôi chuyển sang Linux, tuy nhiên, như vậy là không tìm thấy.Tạo một gói r với một dll C++ trong các cửa sổ và đảm bảo tính di động cho linux

Tôi có nghĩ rằng tệp duy nhất trong thư mục src phải là tệp .cpp không?

Tôi có thực sự cần chạy lệnh SHLIB trong thư mục đó trước khi tạo gói không?

trong không gian tên tôi sử dụng:

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

và trong cuộc gọi chức năng:

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

Trên cửa sổ chạy R CMD kiểm tra hoạt động tốt. Nó có thể là cấu hình Linux R của tôi mà là để đổ lỗi? Dường như cài đặt gói của bên thứ ba tốt.

Tôi bị bối rối!

+0

Không biết nếu bạn sẽ tìm thấy câu trả lời ở đây, tôi sẽ chuyển sang danh sách gửi thư phát triển r: [email protected] Nếu bạn nhận được câu trả lời, bạn có muốn đăng câu trả lời ở đây với tư cách là tốt? Điều này rất thú vị đối với tôi và bất kỳ ai khác viết các gói. –

+3

@ Joris Vấn đề duy nhất là Dirk Eddelbuettel đôi khi ngủ ;-) – mbq

Trả lời

1

Tôi nghĩ bạn chỉ nên sử dụng useDynLib(myc) ... Tra cứu biểu tượng được thực hiện nội bộ.
EDIT: Điều khác là tên của tệp đối tượng này - Tôi nghĩ rằng makefile tiêu chuẩn chỉ đặt tên cho nó với tên gói, vì vậy nó phải được thay vì useDynLib(<package name>). Ít nhất nó luôn làm việc cho tôi.

+0

Thêm 'PACKAGE =" my.package.name "' vào mỗi '.Call' sẽ tránh tra cứu ký hiệu cho mỗi cuộc gọi hàm. –

+0

Bạn có chắc chắn không? Tôi nghĩ rằng nó chỉ là để tránh xung đột tên, trong khi R tối ưu hóa tra cứu với một số từ điển được cập nhật tùy thuộc vào nền tảng quirks và dyn.load đối số. Nhưng tôi không chắc chắn chút nào. – mbq

+0

"tra cứu biểu tượng" có lẽ là cụm từ sai.Tôi không nhớ chính xác hành vi, nhưng kể cả đối số 'PACKAGE' đã ngăn chặn một tra cứu tăng đáng kể tốc độ lặp lại các cuộc gọi đến' .Call'. Nó có thể là 'getCallingDLL' hoặc' getDLLRegisteredRoutines' ... –

2

Có hàng trăm gói trên CRAN thực hiện thành công những gì bạn cố gắng làm - xây dựng một gói có nguồn được biên dịch trên bất kỳ nền tảng được hỗ trợ nào.

Chiến lược tôi thích là lấy một hoặc nhiều gói hiện có và xem chính xác cách chúng được thiết lập. Sau đó bạn có thể sao chép công thức làm việc tùy thuộc vào cách nó tương ứng với thiết lập của bạn (có hoặc không có NAMESPACE, có hoặc không có thư viện bên ngoài như libxml etc pp_)

1

Tôi đã lấy lời khuyên của Dirk và duyệt một vài gói trên CRAN.

Cách tiếp cận chung dường như là sử dụng useDynLib (package_name) như được đề xuất bởi mbq trong tệp NAMESPACE. Sau đó tôi đã sử dụng cuộc gọi:

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

trong mã R theo đề xuất của Joshua.

Bây giờ cài đặt và hoạt động tốt trên Linux và Windows :-)

Tôi nghĩ rằng tôi sẽ sớm chuyển sang Rcpp như trong-R công cụ biên soạn và xây dựng gói bộ xương trông rất hấp dẫn.

Cảm ơn tất cả!

Các vấn đề liên quan