不使用`$`访问网格中的Python对象

时间:2018-01-22 01:55:20

标签: r reticulate

R包reticulate有一个custom $ operator,它在等效的Python模块/对象中充当.运算符。自$ cannot be evaluated的第二个参数以来,在这种情况下如何将参数传递给它?

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')")))

然而这些都没有奏效。

1 个答案:

答案 0 :(得分: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