【问题标题】:How to return multiple objects from R script executed in Python如何从在 Python 中执行的 R 脚本返回多个对象
【发布时间】:2019-02-27 23:09:59
【问题描述】:

所以我正在努力使用 rpy2 包来集成 R 和 Python 之间的一些工作流。

例如,假设我正在尝试运行一个在 R 中进行线性回归的 Python 脚本,并且我想返回其中的所有元素(实际上我正在尝试做一些比这更复杂的事情) .

我在 Python 中执行以下操作(调用 R;假设您已安装 rpy2):

import rpy2.robjects as ro
test = ro.r('''
            # Load in data
            df <- mtcars
            # Run regression
            out = lm(formula='mpg ~ cyl + hp + wt',data=df)
            ''')

现在呢?我有一个问题:

  1. 如何从结果中提取各种元素?在 R 中,它们将是 out$coefficientsout$residuals 等。我知道有这方面的文档,但我有点迷茫。理想情况下,我希望元素采用有用的格式,例如 pandas 数据框或索引列表等。

  2. df 会发生什么? robjects.r() 似乎只是保存了您最后提供的任何东西,并丢弃了其他所有东西。我想我可以使用它,但这并不理想。

  3. 与 2 相关:有更好的方法吗?一般来说,如果有人可以为这类事情提出“最佳实践”,那将很有帮助,因为我确信有很多人对使用 Python 感兴趣,但偶尔有一个非常自定义的函数需要调用 using R 但他们不想看中集成。也许使用 Pythonic 输入参数调用 R 函数的方法会很棒。

【问题讨论】:

  • 任何明智的接口都会为您提供某种类似列表的结构,其索引的名称与您在 R 中找到的名称相同。python 没有与 R 的str 类似的功能。它必须。搜索。 stackoverflow.com/questions/27637281/…
  • 当然。我能够(在上述情况下)通过以下方式提取系数:rpy2.robjects.pandas2ri.ri2py(test.rx2('coefficients')),但这仍然不能回答testdf 发生的情况,而且它也掩盖了这个解决方案的笨拙程度应该是rpy2的基本功能
  • 我不明白。您似乎正在通过一个接口访问 R 功能,该接口预计只返回 out 的值,至少如果我了解典型的函数式编程的话。您是否希望将所有 R 环境都返回给 python?我想这是可能的,但这不是我作为经验丰富的 R 用户所期望的。您能否指出建议 R 环境中的所有对象在将控制权返回给 python 后都应该可用的文档?
  • 我想我只是觉得奇怪的是该脚本没有返回整个环境,因为我没有进行特定的函数调用。从理论上讲,df 与通过test 访问的out 一样有效。唯一的区别是它们被调用的顺序。我写在这里是因为这里的文档不是很好...
  • 即使在函数外部执行多行表达式,R 也只返回最后一次求值的结果。返回多个对象的方法是将list(.) 包裹在它们周围,就像使用函数时一样。

标签: python r rpy2


【解决方案1】:

Q.1:如何从结果中提取各种元素?

Ans.1:运行 R 脚本后:

test = ro.r(your_R_script)

您可以使用此代码打印出test 对象中的所有namesvalues

# iterate on names and values
# be careful output is v long
for n,v in test.items():
    print(n)
    print(v)

要列出所有可用的names,请运行以下代码:

test.names

输出:

StrVector with 12 elements.
'coeffici... 'residuals' 'effects' 'rank' ... 'xlevels' 'call'  'terms' 'model'

要打印“残差”的值,请运行以下命令:

test[test.names.index('residuals')]

Q.2:df 会发生什么?

Ans.2:它在 R 环境中仍然可用,直到您将其删除。您可以运行简单的 R 代码进行检查:

ro.r('''
        # View dataframe
        df
        ''')

Q.3:有更好的方法吗?

Ans.3:(没有答案。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-10
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多