抑制函数的输出

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

有没有可能不用 sink()就能做到这一点?我已经找到了下面描述的解决方案,但是如果可能的话,我想用一行代码来完成。

如何抑制输出

133515 次浏览

It isn't clear why you want to do this without sink, but you can wrap any commands in the invisible() function and it will suppress the output. For instance:

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

Otherwise, you can always combine things into one line with a semicolon and parentheses:

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

R only automatically prints the output of unassigned expressions, so just assign the result of the apply to a variable, and it won't get printed.

Use the capture.output() function. It works very much like a one-off sink() and unlike invisible(), it can suppress more than just print messages. Set the file argument to /dev/null on UNIX or NUL on windows. For example, considering Dirk's note:

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


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

you can use 'capture.output' like below. This allows you to use the data later:

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


test$betas
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))

produces output without NULL at the end of the line or on the next line

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

The following function should do what you want exactly:

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

For example with the function here:

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

running

x = hush(foo())

Will assign 42 to x but will not print "BAR!" to STDOUT

Note than in a UNIX OS you will need to replace "NUL" with "/dev/null"

In case anyone's arriving here looking for a solution applicable to RMarkdown, this will suppress all output:

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


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




})})
```

The code will run, but the output will not be printed to the HTML document

Making Hadley's comment to an answer: Use of apply family without printing is possible with use of the plyr package

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


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

Here is a version that is robust to errors in the code to be shushed:

quietly <- function(x) {
sink("/dev/null") # on Windows (?) instead use `sink("NUL")`
tryCatch(suppressMessages(x), finally = sink())
}
  • This is based directly on the accepted answer, for which thanks.
  • But it avoids leaving output silenced if an error occurs in the quieted code.