如何使用 rPython 在 R 包中导入 Python 库?

How do you import a Python library within an R package using rPython?

基本问题是这样的:假设我正在编写通过 rPython 调用 python 的 R 函数,我想将其集成到一个包中。这很简单——R 函数环绕 Python 无关紧要,您照常进行。例如

# trivial example
# library(rPython)
add <- function(x, y) {
  python.assign("x", x)
  python.assign("y", y)
  python.exec("result = x+y")
  result <- python.get("result")
  return(result)
}

但是,如果带有 R 函数的 python 代码 要求 用户首先导入 Python 库怎么办?例如

# python code, not R
import numpy as np
print(np.sin(np.deg2rad(90)))

# R function that call Python via rPython
# *this function will not run without first executing `import numpy as np`
print_sin <- function(degree){
   python.assign("degree", degree)
   python.exec('result = np.sin(np.deg2rad(degree))')
   result <- python.get('result')
   return(result)
}

如果您 运行 在不导入库 numpy 的情况下执行此操作,您将收到错误消息。

如何在 R 包中导入 Python 库?你怎么用roxygen2评论它?

看来R标准是这样的:

# R function that call Python via rPython
# *this function will not run without first executing `import numpy as np`
print_sin <- function(degree){
   python.assign("degree", degree)
   python.exec('import numpy as np')
   python.exec('result = np.sin(np.deg2rad(degree))')
   result <- python.get('result')
   return(result)
}

每次 运行 一个 R 函数,您将导入整个 Python 库。

正如@Spacedman 和@DirkEddelbuettel 所建议的那样,您可以向包中添加一个 .onLoad/.onAttach 函数,调用 python.exec 来导入用户通常始终需要的模块你的包裹。

您也可以在导入之前 test whether the module has already been imported,但是 (a) 这会让您陷入回归问题,因为您需要导入 sys 才能执行测试,(b ) 该问题的答案表明,至少在性能方面,它应该无关紧要,例如

If you want to optimize by not importing things twice, save yourself the hassle because Python already takes care of this.

(尽管不可否认在该页面的其他地方有一些 狡辩 讨论可能存在性能成本的可能场景)。 但也许你关心的是风格而不是性能导向......