Отключение команды cat - PullRequest
14 голосов
/ 15 марта 2011

Предположим, у меня есть следующая функция:

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

Когда я вызываю f(), есть ли способ остановить cat печать на экране (без изменения функции в любом случае)?

Причина этого вопроса

Мои ученики загружают свои R-файлы.Затем я запускаю сценарии и проверяю, верны ли они.Время от времени студент уходит в команду cat.Это особенно раздражает, когда идет длинный цикл

Ответы [ 4 ]

19 голосов
/ 15 марта 2011

В Linux вы можете использовать sink() вызов /dev/null (или временного файла в другой ОС, см. ?tempfile):

sink(file="/dev/null")
f()
sink()
5 голосов
/ 15 марта 2011

Это должно сработать?

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

Просто замените cat на пустое function, а затем установите его обратно на завершение

2 голосов
/ 29 декабря 2015

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()
2 голосов
/ 15 марта 2011

Вот забавный хак, который комментирует все cat() в функции. Не уверен, если это дает ошибки или нарушает функцию, хотя:

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

f()

[1] 1

Edit:

Другой вариант - это в основном ответ Juba, использующий сток, но вы можете использовать пакет Defaults, чтобы изменить поведение по умолчанию cat. Аргумент file в основном выводит свой вывод в файл. Итак:

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

f()

Гарантирует, что выводится только cat, а не print или около того. Однако это резко сокращает время выполнения, поскольку теперь файл открывается и закрывается при каждом запуске cat().

...