禁止函数的输出

Suppress output of a function

提问人:Tor 提问时间:4/28/2010 最后编辑:HenrikTor 更新时间:6/12/2023 访问量:143637

问:

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

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

如何抑制输出

r

评论

2赞 Dirk Eddelbuettel 4/28/2010
你能解释一下你所说的“内联做这个”是什么意思吗?否则,您引用的问题已经提供了答案,这是重复的。
1赞 Tor 4/28/2010
此解决方案需要三行,一行重定向输出、命令,另一行用于重新打开输出。
10赞 hadley 4/28/2010
或使用 .或者从 plyr 包中使用。capture.output*_ply
1赞 Sharpie 4/28/2010
我赞同 Hadley 的建议——如果你真的想在不打印输出的情况下执行一个 apply 函数,比如 ,那么从他的包中“l_ply”可能是最合适的选择。lapplyplyr

答:

113赞 Shane 4/28/2010 #1

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

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

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

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

评论

7赞 Dirk Eddelbuettel 4/28/2010
try 'invisible(cat(“Hi\n”))' -- 只禁止表达式的打印,它不是单行。invisible()sink()
2赞 Shane 4/28/2010
是的,但我认为它满足了提问者的需求,除非我在问题中遗漏了什么......
1赞 Shane 4/28/2010
例如,这抑制了 的返回,如以下问题所示: 。applyinvisible(apply(matrix(1:10), 1, as.numeric))
1赞 Cookie 11/9/2012
而不是我绝对更喜欢,就像上面一样有效地做到了,只是好得多(看看源代码,它在上面的时尚中称为水槽,加上它周围的一些好东西)。{ sink("/dev/null"); ....; sink(); }capture.outputcapture.output
3赞 Tomas 8/1/2013
在 Windows 下不起作用。我认为最好的解决方案是使用idwsink
11赞 Aniko 4/28/2010 #2

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

评论

9赞 keithpjolley 10/8/2018
某些函数中有一个 OR,它进入屏幕,而不是分配。print()cat()
73赞 Sharpie 4/28/2010 #3

使用该函数。它的工作方式非常像一次性的,与 不同的是,它可以抑制的不仅仅是打印消息。将参数设置为 在 UNIX 或 Windows 上,或者更好地使用 (>= 3.6.0) 来实现平台独立性。如果需要支持 R< 3.6,请使用 .例如,考虑 Dirk 的注释:capture.output()sink()invisible()file"/dev/null""NUL"nullfile()R.utils::nullfile()

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

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

评论

17赞 Tomas 8/1/2013
如果您想将其应用于返回某个值的函数并且想要使用此值,则不起作用
11赞 drmariod 9/8/2015
@TMS 在过去的几个月里,有什么变化吗?我刚刚测试了使用函数返回的值,它起作用了...... 之后有......capture.output(x <- log(2))xlog(2)
1赞 Sky Scraper 1/25/2022
这不适用于红色输出。
3赞 Matifou 2/21/2022
在您的代码中使用可能比特定于平台的 nullfile()/NUL 更干净?nullfile()
0赞 Edgar Alarcón 10/5/2023
工作正常!实际上,对于ggplot,我还在之后组合了a以完全隐藏它suppressMessages
11赞 Kristy 12/16/2014 #4

您可以使用“capture.output”,如下所示。这允许您稍后使用数据:

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

test$betas

评论

1赞 Sky Scraper 1/25/2022
这不适用于红色输出。
0赞 Bryan King 2/8/2016 #5
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
29赞 Danny 4/21/2018 #6

以下函数应完全执行所需的操作:

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!”打印到 STDOUT

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

评论

4赞 tomka 11/24/2018
这是唯一能满足我需求的答案,被低估了。
4赞 gaspar 4/9/2020
正是我需要的
0赞 Sky Scraper 1/25/2022
这对我不起作用,仍然输出红字
0赞 Danny 1/26/2022
@SkyScraper - 你能举一个简短的玩具例子来说明你正在做的事情导致它失败吗?
3赞 Sky Scraper 1/26/2022
@Danny我弄清楚了这个问题,输出是messages(),这种方法不适用于这种输出。我不得不使用suppressMessages()
7赞 stevec 5/3/2020 #7

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

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

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


})})
```

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

0赞 2 revstjebo #8

将 Hadley 的评论作为答案:使用包可以在不打印的情况下使用 apply familyplyr

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

plyr::l_ply(x, function(x) x + 1)
0赞 deep_friar 4/14/2022 #9

下面是一个版本,它对要关闭的代码中的错误很可靠:

quietly <- function(x) {
  sink("/dev/null") # on Windows (?) instead use `sink("NUL")`
  tryCatch(suppressMessages(x), finally = sink())
}
  • 这是直接基于公认的答案,谢谢。
  • 但是,如果静默的代码中发生错误,它可以避免使输出静音。

评论

0赞 Col Bates - collynomial 4/19/2022
OP 要求一个遗漏的答案。sink
0赞 deep_friar 4/21/2022
OP 接受了通过 .此答案将更新已接受的答案,以避免在应用答案的代码中发生错误时出现的陷阱。sink
0赞 Col Bates - collynomial 4/22/2022
如果您的答案增强了现有的已接受答案,则最好建议对该答案进行编辑,或将其作为答案下方的评论。无论OP接受什么,提供的答案都应该回答所提出的问题。Stack Overflow 是一个社区。如果其他人有相同的问题,想要避免它将被标记为重复,即使这个问题在这里没有答案。sink
0赞 stevec 3/20/2023 #10

如果你想知道如何抑制一个,你可以这样使用:warning()suppressWarnings()

suppressWarnings(warning("hi"))

而这两个仍将显示警告:

invisible(warning("Hi"))
# shows 'Hi'

capture.output(warning("Hi"), file='NUL')
# shows 'Hi'
0赞 ramon vazquez 6/9/2023 #11

对于 R 函数中的 return(something) 部分:

return(invisible(something))  

工作正常

invisible(return(something))

根本不起作用