【问题标题】:How to silence the output from this R package?如何使这个 R 包的输出静音?
【发布时间】:2011-05-30 14:38:47
【问题描述】:

我正在使用 R 中的 LowRankQP() 包,即使设置 verbose=FALSE 仍然会产生很多输出(参见下面的示例)。

输出来自代码的编译部分。有没有一种方法(包装函数?)在 R 中调用 LowRankQP() 绝对无声(即不在屏幕上打印任何内容)而不修改底层编译代码(两个电子邮件地址与此包关联的仍然有效)?

library(LowRankQP)

Vmat <- matrix(0,6,6)
diag(Vmat) <- c(1, 1,1,0,0,0)
dvec <- c(0,-5,0,0,0,0)
Amat <- matrix(c(-4,-3,0,-1,0,0,2,1,0,0,-1,0,0,-2,1,0,0,-1),6,3)
bvec <- c(-8,2,0)
uvec <- c(100,100,100,100,100,100)

aa<-LowRankQP(Vmat,dvec,t(Amat),bvec,uvec,method="CHOL")

# LowRankQP CONVERGED IN 15 ITERATIONS
# 
#     Primal Feasibility    =   2.5719308e-16
#     Dual Feasibility      =   7.1949984e-16
#     Complementarity Value =   3.3066705e-11
#     Duality Gap           =   3.3065273e-11
#     Termination Condition =   9.7802929e-12

这是以“LowRankQP CONVERGED IN 15 ITERATIONS”开头的部分,我想去掉。

Ubuntu 11.04、R 版本 2.12.1 和 LowRankQP() 1.0.1。

【问题讨论】:

  • 请添加一个可重现的示例。从我做的几次测试中我没有遇到任何问题。
  • 无法在 Windows 上重现,我没有得到任何输出。请 1) 更新到最新版本,以及 2) 如果仍然存在,请通知包的开发人员。这闻起来像是 linux 和 Windows 版本之间的一些错误/不一致。
  • 感谢 J.M.(我已经运行了 R/软件包的最新版本,所以我会邮寄给开发人员)。
  • 显然这个包已经不再主动维护了(maintainer后面的地址已经死了)。

标签: r


【解决方案1】:

sink(file=NULL) 不起作用,因为它关闭最后一个接收器,仅此而已。

sink(file=NULL) 警告信息: In sink(file = NULL) : no sink to remove

虽然有效的是:

f = file()
sink(file=f) ## silence upcoming output using anonymous file connection
... your code here ...
sink() ## undo silencing
close(f)

使用匿名文件的优点是与平台无关,即您不必想出一个临时文件名。

例子:

f = file()
sink(file=f)
example(glm)
sink()
close(f)

我已经成功地将 sink() 用于其他功能(例如 normalmixEM2comp {mixtools})。

(编辑:这篇文章的第一个版本没有使用显式的文件句柄,因此如果你经常调用上面的 sn-p,它会给出一个警告——甚至是一个错误)。现在可以使用 close(f) 修复此问题。

【讨论】:

    【解决方案2】:

    你熟悉R函数sink()吗?从它的帮助页面:

    sink                   package:base                    R Documentation
    
    Send R Output to a File
    
    Description:
    
         ‘sink’ diverts R output to a connection.
    
         ‘sink.number()’ reports how many diversions are in use.
    
         ‘sink.number(type = "message")’ reports the number of the
         connection currently being used for error messages.
    
    Usage:
    
         sink(file = NULL, append = FALSE, type = c("output", "message"),
              split = FALSE)
    
         sink.number(type = c("output", "message"))
    
    Arguments:
    
        file: a writable connection or a character string naming the file
              to write to, or ‘NULL’ to stop sink-ing.
    

    file=NULL 参数是您可能想要的。

    【讨论】:

    • 感谢 D.E.您是否知道有什么方法可以避免这些打印输出也溅到终端窗口 - 这很烦人?
    • sink(file=NULL) 这样做:all 输出变为 NULL。
    • 感谢 D.E.:那么我无法使用它:在上面的代码中,我应该在哪里使用 sink(file=NULL) 以便消息不会打印在屏幕上?
    • 在调用生成输出的命令之前,您的目标是抑制。您是否阅读了sink() 的帮助页面
    • 有点讽刺的是,当 a) 没有人在这里用他们的首字母签名和 b) 你自己躲在匿名句柄后面时,你坚持用他们的名字首字母称呼每个人。
    【解决方案3】:

    好的,我可以通过注释掉 LowRankQP.c 的第 413->418 行并从 .tar.gz 重新安装它(或者添加一个新选项 verbose==2)来做到这一点。

    【讨论】:

      【解决方案4】:

      根据 cbielow 的回答,这里有一个小函数可以使 cat()print()(但不是 message()warning())静音并返回表达式返回的任何内容:

      shut_up = function(expr) {
        #temp file
        f = file()
      
        #write output to that file
        sink(file = f)
      
        #evaluate expr in original environment
        y = eval(expr, envir = parent.frame())
      
        #close sink
        sink()
      
        #get rid of file
        close(f)
      
        y
      }
      

      测试:

      > shut_up(print(1))
      [1] 1
      > shut_up(cat(1))
      NULL
      > shut_up(message(1))
      1
      NULL
      > shut_up(warning(1))
      [1] "1"
      Warning message:
      In eval(expr, envir = parent.frame()) : 1
      

      请注意,print()warning() 会返回输出,因为这些函数会静默返回其输入,而 cat()message() 会返回 NULL

      【讨论】:

        【解决方案5】:

        我不知道它是否会起作用,但你可以试试invisible()。我不知道你正在使用的功能,我不知道隐形是否可以使cat()静音。但你可以试一试。

        【讨论】:

        • All invisible 真正的作用是阻止其内容的返回值被打印出来,所以这无济于事。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-09
        • 2021-08-18
        • 1970-01-01
        • 2011-01-18
        • 2015-03-10
        • 1970-01-01
        • 2011-03-24
        相关资源
        最近更新 更多