簡體   English   中英

抑制function的output

[英]Suppress output of a function

我希望抑制一個命令的 output(在本例中為apply函數)。

是否可以在不使用sink()下執行此操作? 我找到了下面描述的解決方案,但如果可能的話,我想在一行中完成。

如何壓制output

目前尚不清楚為什么要在沒有sink的情況下執行此操作,但是您可以將任何命令包裝在invisible()函數中,它會抑制輸出。 例如:

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

否則,您始終可以使用分號和括號將內容組合成一行:

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

使用capture.output()函數。 它的工作原理非常像一次性sink()並且與invisible()不同,它可以抑制的不僅僅是打印消息。 將文件參數設置為 UNIX 上的/dev/null或 Windows 上的NUL 例如,考慮 Dirk 的注釋:

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

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

以下功能應該完全符合您的要求:

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

R 只會自動打印未分配表達式的輸出,因此只需將apply<\/code>的結果分配給一個變量,它就不會被打印出來。

"

您可以使用如下所示的“capture.output”。 這允許您稍后使用數據:

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

test$betas

如果有人來到這里尋找適用於 RMarkdown 的解決方案,這將抑制所有輸出:

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

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


})})
```

代碼將運行,但輸出不會打印到 HTML 文檔

使哈德利對答案的評論(希望使它更好地可見)。 使用plyr<\/code>包可以在不打印的情況下使用 apply 系列

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

plyr::l_ply(x, function(x) x + 1)
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

如果您想知道如何抑制warning()您可以像這樣使用suppressWarnings()

suppressWarnings(warning("hi"))

而這兩個仍然會顯示警告:

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

capture.output(warning("Hi"), file='NUL')
# shows 'Hi'

對於 R function 中的 return(something) 部分:

return(invisible(something))  

工作正常

invisible(return(something))

根本不起作用

這是一個對要隱藏的代碼中的錯誤具有魯棒性的版本:

quietly <- function(x) {
  sink("/dev/null") # on Windows (?) instead use `sink("NUL")`
  tryCatch(suppressMessages(x), finally = sink())
}
  • 這直接基於已接受的答案,對此表示感謝。
  • 但是如果靜默代碼中發生錯誤,它可以避免讓 output 靜默。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM