Hướng dẫn r package python dependencies - r gói phụ thuộc python

Nếu bạn viết gói R sử dụng reticulate làm giao diện cho phiên Python, bạn cũng có thể cần cài đặt một hoặc nhiều gói Python trên máy người dùng để gói của bạn hoạt động. Ngoài ra, bạn có thể thích cách ly người dùng khỏi các chi tiết xung quanh cách Python + reticulate được cấu hình càng nhiều càng tốt. Họa tiết này ghi lại một vài cách tiếp cận để hoàn thành các mục tiêu này.

Cấu hình thủ công

Trước đây, các gói như TensorFlow đã hoàn thành điều này bằng cách cung cấp các chức năng trợ giúp (ví dụ: tensorflow::install_tensorflow()) và ghi lại rằng người dùng nên gọi chức năng này để chuẩn bị môi trường. Ví dụ:

library(tensorflow)
install_tensorflow()
# use tensorflow

Nhược điểm lớn nhất với phương pháp này là nó yêu cầu người dùng tải xuống thủ công và cài đặt phiên bản Python thích hợp. Ngoài ra, nếu người dùng chưa tải xuống phiên bản Python thích hợp, thì phiên bản được phát hiện trên hệ thống người dùng có thể không phù hợp với các yêu cầu do gói tensorflow áp đặt - dẫn đến nhiều rắc rối hơn.

Khắc phục điều này thường yêu cầu hướng dẫn người dùng cài đặt Python, sau đó sử dụng API reticulate (ví dụ: & NBSP; ________ 10 và các công cụ khác) để tìm và sử dụng phiên bản Python + phù hợp. Điều này, có thể hiểu được, chi phí nhận thức nhiều hơn bạn có thể muốn áp đặt cho người dùng gói của bạn.

Một vấn đề lớn khác với cấu hình thủ công là nếu các gói R khác nhau sử dụng các môi trường python mặc định khác nhau, thì các gói đó không bao giờ được tải trong cùng một phiên R (vì chỉ có một môi trường Python hoạt động tại một thời điểm trong một phiên R) .

Cấu hình tự động

Với các phiên bản mới hơn của reticulate, các gói máy khách có thể khai báo trực tiếp các phụ thuộc python của họ trong tệp

Package: rscipy
Title: An R Interface to scipy
Version: 1.0.0
Description: Provides an R interface to the Python package scipy.
Config/reticulate:
  list(
    packages = list(
      list(package = "scipy")
    )
  )
< ... other fields ... >
2, với việc sử dụng trường
Package: rscipy
Title: An R Interface to scipy
Version: 1.0.0
Description: Provides an R interface to the Python package scipy.
Config/reticulate:
  list(
    packages = list(
      list(package = "scipy")
    )
  )
< ... other fields ... >
3.

Với cấu hình tự động, reticulate muốn khuyến khích một thế giới trong đó các gói R khác nhau gói các gói Python có thể sống cùng nhau trong cùng một phiên Python Môi trường / R. Về bản chất, chúng tôi muốn giảm thiểu số lượng xung đột có thể phát sinh thông qua các gói R khác nhau có các phụ thuộc python không tương thích.

Sử dụng cấu hình/reticulation

Ví dụ: nếu chúng tôi có gói

Package: rscipy
Title: An R Interface to scipy
Version: 1.0.0
Description: Provides an R interface to the Python package scipy.
Config/reticulate:
  list(
    packages = list(
      list(package = "scipy")
    )
  )
< ... other fields ... >
5 đóng vai trò là giao diện cho gói Scipy Python, chúng tôi có thể sử dụng các
Package: rscipy
Title: An R Interface to scipy
Version: 1.0.0
Description: Provides an R interface to the Python package scipy.
Config/reticulate:
  list(
    packages = list(
      list(package = "scipy")
    )
  )
< ... other fields ... >
2 sau đây: sau đây:

Package: rscipy
Title: An R Interface to scipy
Version: 1.0.0
Description: Provides an R interface to the Python package scipy.
Config/reticulate:
  list(
    packages = list(
      list(package = "scipy")
    )
  )
< ... other fields ... >

Cài đặt

Với điều này, reticulate sẽ tự động cấu hình môi trường Python cho người dùng khi gói

Package: rscipy
Title: An R Interface to scipy
Version: 1.0.0
Description: Provides an R interface to the Python package scipy.
Config/reticulate:
  list(
    packages = list(
      list(package = "scipy")
    )
  )
< ... other fields ... >
5 được tải và sử dụng (tức là & NBSP; Nó không còn cần thiết phải cung cấp cho người dùng chức năng loại
Package: rscipy
Title: An R Interface to scipy
Version: 1.0.0
Description: Provides an R interface to the Python package scipy.
Config/reticulate:
  list(
    packages = list(
      list(package = "scipy")
    )
  )
< ... other fields ... >
9 đặc biệt).

Cụ thể, sau khi gói

Package: rscipy
Title: An R Interface to scipy
Version: 1.0.0
Description: Provides an R interface to the Python package scipy.
Config/reticulate:
  list(
    packages = list(
      list(package = "scipy")
    )
  )
< ... other fields ... >
5 được tải, sẽ xảy ra như sau:

  1. Trừ khi người dùng đã hướng dẫn rõ ràng reticulate sử dụng môi trường Python hiện có, reticulate sẽ nhắc người dùng tải xuống và cài đặt miniconda (nếu cần).

  2. Sau đó, khi phiên Python được khởi tạo bởi reticulate, tất cả các phụ thuộc được khai báo của các gói được tải trong

    Package: rscipy
    Title: An R Interface to scipy
    Version: 1.0.0
    Description: Provides an R interface to the Python package scipy.
    Config/reticulate:
      list(
        packages = list(
          list(package = "scipy")
        )
      )
    < ... other fields ... >
    3 sẽ được phát hiện.

  3. Những phụ thuộc này sau đó sẽ được cài đặt vào một môi trường conda thích hợp, như được cung cấp bởi cài đặt miniconda.

Trong trường hợp này, quy trình công việc của người dùng cuối sẽ chính xác như với gói R không có phụ thuộc Python:

library(rscipy)
# use the package

Nếu người dùng không có phiên bản Python có sẵn trên hệ thống của họ, họ sẽ được nhắc cài đặt miniconda. Nếu họ đã có Python, thì các gói Python cần thiết (trong trường hợp này là

library(rscipy)
# use the package
5) sẽ được cài đặt trong môi trường chia sẻ tiêu chuẩn cho các phiên R (thường là môi trường ảo hoặc môi trường Conda có tên là R R-Reticulation).

Trên thực tế, người dùng phải trả một lần, chi phí khởi tạo chủ yếu là tự động để sử dụng gói của bạn, và sau đó mọi thứ sẽ hoạt động như bất kỳ gói R nào khác. Cụ thể, người dùng được cách nhiệt từ các chi tiết như cách thức hoạt động của reticulate.

Cấu hình .Orload

Trong một số trường hợp, người dùng có thể cố gắng tải gói hàng của bạn sau khi Python đã được khởi tạo. Để đảm bảo rằng reticulate vẫn có thể định cấu hình môi trường Python hoạt động, bạn có thể bao gồm mã:

.onLoad <- function(libname, pkgname) {
  reticulate::configure_environment(pkgname)
}

Điều này sẽ hướng dẫn reticulate ngay lập tức cố gắng định cấu hình môi trường Python hoạt động, cài đặt bất kỳ gói Python cần thiết nào khi cần thiết.

Phiên bản

Mục tiêu của các cơ chế này là cho phép dễ dàng tương tác giữa các gói R có phụ thuộc Python, cũng như để giảm thiểu các bước cấu hình/phiên bản chuyên dụng cho người dùng cuối. Cuối cùng, reticulate sẽ (theo mặc định) theo dõi một phiên bản Python cũ hơn so với bản phát hành hiện tại, cho các gói Python thời gian để thích nghi theo yêu cầu. Python 2 sẽ không được hỗ trợ.

Các công cụ để phá vỡ các quy tắc này chưa được thực hiện, nhưng sẽ được cung cấp khi có nhu cầu.

Định dạng

Các phụ thuộc gói Python được tuyên bố nên có định dạng sau:

  • Gói: Tên của gói Python.: The name of the Python package.

  • Phiên bản: Phiên bản của gói nên được cài đặt. Khi không được xác định, phiên bản mới nhất có sẵn sẽ được cài đặt. Điều này chỉ nên được đặt trong các trường hợp đặc biệt-ví dụ: nếu phiên bản được phát hành gần đây nhất của gói Python phá vỡ khả năng tương thích với gói của bạn (hoặc các gói Python khác) theo cách cơ bản. Nếu nhiều gói R yêu cầu các phiên bản khác nhau của gói Python cụ thể, reticulate sẽ báo hiệu cảnh báo.: The version of the package that should be installed. When left unspecified, the latest-available version will be installed. This should only be set in exceptional cases – for example, if the most recently-released version of a Python package breaks compatibility with your package (or other Python packages) in a fundamental way. If multiple R packages request different versions of a particular Python package, reticulate will signal a warning.

  • PIP: Cho dù gói này có nên được lấy từ PYPI với

    .onLoad <- function(libname, pkgname) {
      reticulate::configure_environment(pkgname)
    }
    1 hay (nếu
    .onLoad <- function(libname, pkgname) {
      reticulate::configure_environment(pkgname)
    }
    2) từ các kho lưu trữ Anaconda.
    : Whether this package should be retrieved from the PyPI with
    .onLoad <- function(libname, pkgname) {
      reticulate::configure_environment(pkgname)
    }
    1, or (if
    .onLoad <- function(libname, pkgname) {
      reticulate::configure_environment(pkgname)
    }
    2) from the Anaconda repositories.

Ví dụ: chúng ta có thể thay đổi chỉ thị

Package: rscipy
Title: An R Interface to scipy
Version: 1.0.0
Description: Provides an R interface to the Python package scipy.
Config/reticulate:
  list(
    packages = list(
      list(package = "scipy")
    )
  )
< ... other fields ... >
3 từ trên cao để chỉ định rằng
.onLoad <- function(libname, pkgname) {
  reticulate::configure_environment(pkgname)
}
4 được cài đặt từ PYPI (với
.onLoad <- function(libname, pkgname) {
  reticulate::configure_environment(pkgname)
}
1):

Config/reticulate:
  list(
    packages = list(
      list(package = "scipy", version = "1.3.0", pip = TRUE)
    )
  )