15

次の関数があるとします。

## Just an example
f = function() { 
  for(i in 1:10000)
      cat(i)
  return(1)
}

呼び出したときに、画面への印刷f()を停止する方法はありcatますか (機能を変更せずに)。

この質問の背後にある理由

私の生徒は R ファイルをアップロードします。次に、スクリプトを実行して、それらが正しいかどうかを確認します。時々、学生はコマンドで去りcatます。これは、長い for ループにある場合に特にイライラします。

4

5 に答える 5

20

sink()Linux では、次の呼び出しを使用できます/dev/null(または別の OS の一時ファイルへの呼び出し。「 」を参照?tempfile)。

sink(file="/dev/null")
f()
sink()
于 2011-03-15T10:41:31.450 に答える
5

これはうまくいくはずですか?

oldcat = cat
cat = function( ..., file="", sep=" ", fill=F, labels=NULL, append=F ) {}
f()
cat = oldcat

cat空のに置き換えて、function完了時に元に戻すだけです

于 2011-03-15T10:41:16.160 に答える
2

cat()これは、関数内のすべてのをコメントアウトする面白いハックです。ただし、これによってエラーが発生するのか、関数が機能しなくなるのかはわかりません。

foo <- deparse(f)
f <- eval(parse(text=gsub("cat","#cat",foo)))

f()

[1] 1

編集:

もう1つのオプションは、基本的にはシンクを使用したJubaの回答ですが、Defaultsパッケージを使用してのデフォルトの動作を変更できますcatfile引数は基本的にその出力をファイルに沈めます。それで :

library("Defaults")
setDefaults(cat,file="sink.txt")

f()

の出力のみがシンクされ、シンクされcatないprintようにします。ただし、実行するたびにファイルが開いたり閉じたりするため、実行時間が大幅に短縮されますcat()

于 2011-03-15T11:18:23.380 に答える
2

capture.output()あなたが望むことをしinvisible()ます:

f <- function() {
    cat("Hello")
    return(TRUE)
}
f1 <- function() {
    invisible(capture.output(f()))
}
x <- f1()

これも機能します:

f2 <- function() {
    tmp <- tempfile()
    sink(tmp)
    on.exit(sink())
    on.exit(file.remove(tmp), add = TRUE)
    invisible(force(f())) 
}
x <- f2()
于 2015-12-29T12:16:31.547 に答える