Подтвердить что ты не робот

Отключение команды cat

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

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

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

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

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

4b9b3361

Ответ 1

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

sink(file="/dev/null")
f()
sink()

Ответ 2

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

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

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

Ответ 3

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

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

f()

[1] 1

Изменить:

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

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

f()

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

Ответ 4

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()