如何使用 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.
(尽管不可否认在该页面的其他地方有一些 狡辩 讨论可能存在性能成本的可能场景)。
但也许你关心的是风格而不是性能导向......
基本问题是这样的:假设我正在编写通过 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.
(尽管不可否认在该页面的其他地方有一些 狡辩 讨论可能存在性能成本的可能场景)。
但也许你关心的是风格而不是性能导向......