【问题标题】:rpy2: how to suppress R outputrpy2:如何抑制 R 输出
【发布时间】:2017-06-04 15:24:43
【问题描述】:

在 Python shell 中,当我发出以下命令时使用 rpy2

In [93]: x = robjects.r.bfast(data, h=0.1, season="none", max_iter=1)
[1]
 "No seasonal model will be fitted!"

我得到了这个不受欢迎的输出

[1]
 "No seasonal model will be fitted!"

有没有办法抑制这个输出?我想将此调用包装到一个函数,然后再包装到一个 api 调用。因此,将输出重定向到标准输出是不可取的。

也就是说,在rpy2怎么办:

sink("/dev/null")

有没有比

更好的方法
robjects.r('sink("/dev/null")')

?

【问题讨论】:

    标签: python r rpy2


    【解决方案1】:

    显然,bfast 方法有条件地将该消息打印到控制台,没有包装器不打印,这不是可取的代码。根据拉取请求与开发人员联系。

    根据这个solution,考虑R 的capture.output,它返回输出的字符串。

    ...
    from rpy2.robjects.packages import importr
    
    utils = importr('utils')    
    bfast = importr('bfast')
    
    # NOTICE R's PERIODS CHANGED TO UNDERSCORE TO FIT PYTHON'S OBJECT MODEL
    x = utils.capture_output(bfast(data, h=0.1, season="none", max_iter=1))
    

    【讨论】:

    • 感谢@Parfait,但为什么这比robjects.r('sink("/dev/null")') 更好,因为我不关心print 的输出?
    • R 文档将capture.output()sink() 类比为with()attach()。我的猜测是,这些比较中的前者不会像后者那样影响全局环境,但仅限于特定的调用线路,因此之前和之后的线路不受影响。
    • 我收到一个错误:module 'base' has no attribute 'capture_output'
    • @eotp, capture.output 实际上来自 utils 而不是 base 包(都是 R 标准库的一部分)。见编辑。
    • @Parfait 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2018-08-23
    • 1970-01-01
    • 2014-10-17
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多