Phương pháp được đề xuất để trích xuất thư viện C độc lập từ gói R hiện có?


8

Nhóm của tôi đã phát triển gói R để mô phỏng sự phát triển của cây (xem kho GitHub ). Gói R sử dụng .Callđể giao tiếp với C.

Chúng tôi đã quyết định rằng sẽ rất đáng để tạo một thư viện C độc lập. Hai lý do chính là 1) để sử dụng các công cụ gỡ lỗi C quen thuộc và 2) một phần lớn cộng đồng nhà phát triển / người dùng quen thuộc với các ngôn ngữ được biên dịch (chủ yếu là các mô hình trong lớp được viết bằng C hoặc Fortran). Tuy nhiên, gói R có thể truy cập được đối với nhiều người ngoài cộng đồng này, vì vậy chúng tôi muốn duy trì chức năng của nó.

Tôi đã xem xét một số câu hỏi liên quan, ví dụ: https://stackoverflow.com/q/12328156/199217 , thảo luận về các gói R với phụ thuộc thư viện C, nhưng chưa tìm thấy câu hỏi nào liên quan đến việc tách riêng gói R hiện có.

Một cách tiếp cận được đề xuất

(những gì chúng ta đã nghĩ ra cho đến nay ... một người rơm)

  1. Viết bài kiểm tra cho chức năng hiện có
  2. giữ thư viện C trong src/thư mục
  3. Đặt mã C dành riêng cho R (ví dụ: SEXPtải thư viện R, v.v.) vào các tệp 'Trình bao bọc R' được thêm trướcR_*
  4. tạo các chức năng riêng biệt để đọc các tệp cấu hình trong C
  5. tạo chức năng C 'chính' để thay thế chức năng trong R
  6. viết một tệp tạo tệp cho thư viện C mà bỏ qua các tệp bao bọc R
  7. Khi thư viện C hoạt động độc lập và tương đương với gói R, chúng tôi có thể xem xét chuyển các hàm C sang một kho lưu trữ riêng, đó sẽ là một phụ thuộc cho gói R

Câu hỏi:

  1. Là nỗ lực này sai lầm?
  2. Chúng ta đang xem xét bất kỳ cạm bẫy tiềm năng?
  3. Có cách nào tốt hơn để phát triển song song cả thư viện R và C không?
  4. Có ví dụ nào về các thư viện C đã được tách rời khỏi các gói R không?
  5. Làm thế nào chúng ta có thể viết các bài kiểm tra để so sánh các hàm tương đương trong R và C?

Tôi không biết R bên trong, nhưng nói chung về việc nhúng thư viện trong một số trình thông dịch, bạn nên quan tâm rất nhiều về quản lý bộ nhớ (ví dụ: thu gom rác)
Basile Starynkevitch

Câu trả lời:


2

Nói chung, đây là một ý tưởng tốt và nhiều gói làm điều này. Bạn có thể nhìn vào RSQLitecảm hứng - họ đóng gói sqlitevà chỉ bao gồm một số chức năng bao bọc. Tương tự cho rhdf5hdf5

Về điểm của bạn:

Viết bài kiểm tra cho chức năng hiện có

Luôn luôn là một ý tưởng tốt!

Giữ thư viện C trong src/thư mục

Có - hoặc bạn có thể cân nhắc inst/includenếu bạn đã từng đi tuyến đường 'chỉ tiêu đề', laRcpp

Đặt mã C dành riêng cho R (ví dụ: SEXPtải thư viện R, v.v.) vào các tệp 'Trình bao bọc R' được thêm trướcR_*

Có vẻ đủ hợp lý.

Tạo các chức năng riêng biệt để đọc các tệp cấu hình trong C

Không chắc chắn chính xác những gì bạn có ý nghĩa ở đây.

Tạo chức năng C 'chính' để thay thế chức năng trong R

Điều này có vẻ kỳ lạ với tôi. Tại sao bạn cần một main- không phải bạn chỉ đang phát triển một thư viện các hàm có thể gọi được? Hãy để R là của bạn main:)

Viết tệp tạo tệp cho thư viện C mà bỏ qua các tệp bao bọc R

Có, bạn có thể sẽ cần nhiều người tham gia hơn Makefileđể xử lý việc này - một lần nữa tôi đề nghị xem xét mã nguồn cho RSQLite, và R-exts có thể hữu ích.

Khi thư viện C hoạt động độc lập và tương đương với gói R, chúng tôi có thể xem xét chuyển các hàm C sang một kho lưu trữ riêng, đó sẽ là một phụ thuộc cho gói R

Có, điều này có vẻ hợp lý - yêu cầu gói R lấy mã nguồn C khi cần thiết khi xây dựng / phát triển gói. Bằng cách này, chúng có thể được tách rời một cách hiệu quả.


Cảm ơn. 1) "các hàm riêng biệt để đọc tệp cấu hình trong C" là một cách thay thế cho phương pháp hiện tại của chúng tôi sử dụng xmlToList trong R để đọc tệp đầu vào, 2) re "chính" chúng tôi muốn có thể tính toán hoàn toàn trong C bằng cách chuyển cấu hình tập tin để thực thi.
David LeBauer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.