【问题标题】:Suppress output of a function抑制函数的输出
【发布时间】:2010-04-27 16:30:44
【问题描述】:

我希望抑制 one 命令的输出(在本例中为 apply 函数)。

不使用sink() 是否可以做到这一点?我在下面找到了描述的解决方案,但如果可能的话,我想在一行中做到这一点。

How to suppress output

【问题讨论】:

  • 您能解释一下“内联执行”是什么意思吗?否则,您引用的问题已经提供了答案,这是重复的。
  • 此解决方案需要三行,一行重定向输出、命令,然后另一行重新打开输出。
  • 或使用capture.output。或者使用 plyr 包中的*_ply
  • 我赞同 Hadley 的建议——如果你真的想执行一个应用函数,例如 lapply,而不打印输出,那么他的 plyr 包中的 'l_ply` 可能是最合适的选择。

标签: r


【解决方案1】:

不清楚为什么要在没有sink 的情况下执行此操作,但您可以将任何命令包装在invisible() 函数中,它会抑制输出。例如:

1:10 # prints output
invisible(1:10) # hides it

否则,您总是可以用分号和括号将内容组合成一行:

{ sink("/dev/null"); ....; sink(); }

【讨论】:

  • Try 'invisible(cat("Hi\n"))' -- invisible() 只抑制表达式的打印,它不是 sink() 单行。
  • 对,但我认为它满足提问者的需求,除非我在问题中遗漏了什么......
  • 例如,这会抑制 apply 的返回,根据问题:invisible(apply(matrix(1:10), 1, as.numeric))
  • 而不是{ sink("/dev/null"); ....; sink(); },我肯定更喜欢capture.output,因为capture.output实际上确实在上面,但要好得多(看看源代码,它以上述方式调用接收器,加上周围的一些好东西)。
  • 不适用于 Windows 下的 idw 函数。我认为最好的解决方案是使用sink
【解决方案2】:

使用capture.output() 函数。它的工作原理非常类似于一次性的sink(),与invisible() 不同的是,它可以抑制的不仅仅是打印消息。在 UNIX 上将文件参数设置为 /dev/null 或在 Windows 上设置为 NUL。例如,考虑 Dirk 的注释:

> invisible(cat("Hi\n"))
Hi

> capture.output( cat("Hi\n"), file='NUL')
> 

【讨论】:

  • 如果你想将这个应用到一个返回一些值的函数并且你想使用这个值,那么它不起作用
  • @TMS 过去几个月有什么变化吗?我刚刚测试了使用函数返回的值并且它起作用了...capture.output(x <- log(2)) 然后x 的值是log(2)...
  • 这不适用于红色输出。
  • 在代码中使用 nullfile() 可能比特定于平台的 nullfile()/NUL 更干净?
【解决方案3】:

以下函数应该完全符合您的要求:

hush=function(code){
  sink("NUL") # use /dev/null in UNIX
  tmp = code
  sink()
  return(tmp)
}

例如这里的函数:

foo=function(){
  print("BAR!")
  return(42)
}

运行

x = hush(foo())

将 42 分配给 x,但不会打印“BAR!”到标准输出

请注意,在 UNIX 操作系统中,您需要将“NUL”替换为“/dev/null”

【讨论】:

  • 这是我需要的唯一答案,被低估了。
  • 正是我所需要的
  • 这对我不起作用,仍然输出红色字母
  • @SkyScraper - 您能否举一个简短的玩具示例说明您正在做什么导致此操作失败?
  • @Danny 我发现了问题,输出是 messages() 并且这种方法不适用于这种输出。我不得不使用suppressMessages()
【解决方案4】:

R 只会自动打印未分配表达式的输出,因此只需将 apply 的结果分配给变量,它不会被打印。

【讨论】:

  • 某些函数中有一个print()cat(),它们会进入屏幕,而不是分配。
【解决方案5】:

您可以使用如下所示的“capture.output”。这使您可以在以后使用这些数据:

log <- capture.output({
  test <- CensReg.SMN(cc=cc,x=x,y=y, nu=NULL, type="Normal")
})

test$betas

【讨论】:

  • 这不适用于红色输出。
【解决方案6】:

如果有人来到这里寻找适用于 RMarkdown 的解决方案,这将抑制所有输出:

```{r error=FALSE, warning=FALSE, message=FALSE}
invisible({capture.output({

# Your code goes here
2 * 2
# etc
# etc


})})
```

代码将运行,但输出不会打印到 HTML 文档中

【讨论】:

    【解决方案7】:

    让哈德利对答案的评论(希望让它更好地可见)。使用 plyr 包可以在不打印的情况下使用 apply 系列

    x <- 1:2
    lapply(x, function(x) x + 1)
    #> [[1]]
    #> [1] 2
    #> 
    #> [[2]]
    #> [1] 3
    
    plyr::l_ply(x, function(x) x + 1)
    

    reprex package (v0.3.0) 于 2020 年 5 月 19 日创建

    【讨论】:

      【解决方案8】:
      invisible(cat("Dataset: ", dataset, fill = TRUE))
      invisible(cat(" Width: " ,width, fill = TRUE))
      invisible(cat(" Bin1:  " ,bin1interval, fill = TRUE))
      invisible(cat(" Bin2:  " ,bin2interval, fill = TRUE))
      invisible(cat(" Bin3:  " ,bin3interval, fill = TRUE))
      

      在行尾或下一行产生不带 NULL 的输出

      Dataset:  17 19 26 29 31 32 34 45 47 51 52 59 60 62 63
      Width:  15.33333
      
      Bin1:   17 32.33333
      Bin2:   32.33333 47.66667
      Bin3:   47.66667 63
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 2011-03-03
        • 2012-11-09
        • 2023-03-12
        • 1970-01-01
        相关资源
        最近更新 更多