関数の出力を抑制します


90

1つのコマンド(この場合はapply関数)の出力を抑制しようとしています。

使用せずにこれを行うことは可能sink()ですか?以下に説明する解決策を見つけましたが、可能であれば1行でこれを実行したいと思います。

出力を抑制する方法


2
「これをインラインで行う」とはどういう意味ですか?そうでなければ、あなたが引用する質問はすでに答えを提供しており、これは重複しています。
Dirk Eddelbuettel 2010

1
このソリューションでは、3行が必要です。1つは出力のリダイレクト、コマンド、もう1つは出力をオンに戻すためです。
Tor

8
またはを使用しますcapture.output。または*_ply、plyrパッケージから使用してください。
ハドリー2010

1
2番目のHadleyの提案-lapply出力を出力せずになどの適用関数を実際に実行しようとしている場合plyrは、彼のパッケージの「l_ply」がおそらく最も適切な選択です。
シャーピー2010

回答:


92

なぜこれを行わないのかは明確ではありませんがsinkinvisible()関数内の任意のコマンドをラップすることができ、出力が抑制されます。例えば:

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

それ以外の場合は、セミコロンと括弧を使用して、いつでも1行にまとめることができます。

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

5
'invisible(cat( "Hi \ n"))'を試してください-invisible()式の出力を抑制するだけで、sink()ワンライナーではありません。
Dirk Eddelbuettel 2010

2
そうですが、質問に何かが欠けていない限り、質問者のニーズを満たしていると思います...
シェーン

1
たとえば、これによりapply、次の質問のように、の戻りが抑制されますinvisible(apply(matrix(1:10), 1, as.numeric))
シェーン

のではなく{ sink("/dev/null"); ....; sink(); }、私は間違いなく希望capture.outputとして、capture.output効果的に正確に上記の場合と同じかなり良く、(ソースを見て、それが上記の方法のようにシンクを呼び出して、それに加えて周りにいくつかの素晴らしいもの)。
Cookie

3
idwWindowsの機能では動作しません。最善の解決策は使用することだと思いますsink
TMS 2013

58

capture.output()関数を使用します。これは1回限りのように機能しsink()、とは異なりinvisible()、メッセージの印刷以上のものを抑制することができます。/dev/nullUNIXまたはNULWindowsでfile引数をに設定します。たとえば、Dirkのメモを考えてみましょう。

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

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

10
これをある値を返す関数に適用し、この値を使用したい場合は機能しません
TMS 2013

8
@TMS過去数か月の間に何か変更がありましたか?関数によって返される値を使用するようにテストしたところ、機能しました...capture.output(x <- log(2))その後xの値はlog(2)...
drmariod 2015

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!」は出力されません。STDOUTへ

UNIX OSの場合よりも、「NUL」を「/ dev / null」に置き換える必要があることに注意してください。


これは私が必要なことをした唯一の答えであり、過小評価されていました。
tomka 2018年

まさに私も必要なもの
gaspar

3

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.