2

R 包reticulate有一个自定义$运算符,它充当.等效 Python 模块/对象中的运算符。由于$ 无法评估的第二个参数,在这种情况下如何将参数传递给它?

reticulate自述文件上的示例用法是

library(reticulate)
os <- import("os")
os$chdir("tests")
os$getcwd()

我在下面的函数之后,...它将是带有零个或多个参数的 python 调用。

my_function <- function(python_object, ...)

由于函数在全局环境中不存在,因此python_object需要属于类python.builtin.objectpython.builtin.module参数需要作为字符传递。

例如。

my_function(os, "chdir", "tests")
my_function(os, "getcwd")
my_function(r_to_py("my_string"), "lstrip", "my_")

我的想法类似于

do.call("chdir", list("tests"), envir = os)

或者

reticulate:::`$.python.builtin.object`(os, eval(parse(text="chdir('tests')")))

但是这些都没有奏效。

4

1 回答 1

2

实现起来比我想象的要简单得多...

my_function <- function(python_module, attribute, ...) {
  py_call(python_module[[attribute]], ...)
}

一般来说,$是 的简写[[


更新

@jjallaire 指出...

py_call 是一个较低级别的函数,目前没有获得类型包装的好处(但它肯定应该)。

要返回相同的输出(即继承正确的类),请$使用:

  • do.call(python_module[[attribute]], args = list(function_args))
  • python_module[[attribute]](function_args)

代替py_call

请参阅rstudio/reticulate#149

于 2018-01-22T09:55:18.747 回答