禁止功能的输出


90

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

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

如何抑制输出


2
您能解释一下“此内联吗”的意思吗?否则,您引用的问题已经提供了答案,这是重复的。
Dirk Eddelbuettel

1
此解决方案需要三行,一行重定向输出,命令,然后另一行将输出重新打开。
Tor 2010年

8
或使用capture.output。或*_ply从plyr包中使用。
hadley 2010年

1
我第二次推荐Hadley的建议-如果您确实试图执行诸如lapplyApply的apply函数而不打印输出,那么从他的plyr软件包中选择'l_ply'可能是最合适的选择。
Sharpie

Answers:


92

尚不清楚为什么不使用来执行此操作sink,但是您可以将任何命令包装在invisible()函数中,它将抑制输出。例如:

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

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

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

5
尝试'invisible(cat(“ Hi \ n”))'-invisible()仅禁止打印表达式,它不是sink()单线的。
Dirk Eddelbuettel

2
是的,但是我认为它可以满足发问者的需求,除非我在问题中遗漏了某些东西……
Shane 2010年

1
例如,这会apply根据问题抑制的返回invisible(apply(matrix(1:10), 1, as.numeric))
Shane

而不是{ sink("/dev/null"); ....; sink(); }我绝对喜欢capture.outputcapture.output上面那样有效地做,要好得多(看看源代码,它像上述方式那样调用接收器,并在其中添加一些不错的东西)。
Cookie

3
idw在Windows下无法正常使用。我认为最好的解决方案是使用sink
TMS 2013年

58

使用capture.output()功能。它的工作原理非常像一次性的,与之sink()不同invisible(),它不仅可以抑制打印消息,还可以抑制更多的工作。/dev/null在UNIX或NULWindows上将file参数设置为。例如,考虑Dirk的注释:

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

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

10
如果您想将此值应用于返回一些值的函数,并且想要使用此值,则无法正常工作
TMS

8
@TMS在过去几个月中有什么变化吗?我刚刚测试过使用函数返回的值,它确实起作用了……capture.output(x <- log(2))之后x的值是log(2)……
drmariod

10

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

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

test$betas

9

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


4
某些功能在屏幕上而不是分配中带有print()cat()
keithpjolley

9

以下功能应完全满足您的要求:

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

例如,这里的功能:

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

跑步

x = hush(foo())

将x赋值为42,但不打印“ BAR!” 到标准输出

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


这是唯一满足我需要的答案,被低估了。
tomka '18

正是我需要的
gaspar

2

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

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

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


})})
```

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


1

使哈德利评论一个答案(希望使其更清晰可见)。申请家庭不打印的使用可能与使用的plyr

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

plyr::l_ply(x, function(x) x + 1)

reprex软件包(v0.3.0)创建于2020-05-19


0
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.