0

基本问题是这样的:假设我正在编写通过调用 python 的 R 函数rPython,并且我想将它集成到一个包中。这很简单——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 库。

4

1 回答 1

1

正如@Spacedman 和@DirkEddelbuettel 建议的那样,您可以在您的包中添加一个.onLoad/.onAttach函数,该函数调用python.exec导入包的用户通常总是需要的模块。

您还可以在导入之前测试模块是否已经导入,但是(a)这会让您陷入一些回归问题,因为您需要导入sys才能执行测试,(b)该问题的答案表明至少在性能方面,这无关紧要,例如

如果您想通过不导入两次来进行优化,请省去麻烦,因为 Python 已经解决了这个问题。

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

于 2016-10-20T19:58:06.903 回答