Ответ 1
В Linux вы можете использовать вызов sink()
для /dev/null
(или во временный файл на другой ОС, см. ?tempfile
):
sink(file="/dev/null")
f()
sink()
Предположим, что у меня есть следующая функция:
## Just an example
f = function() {
for(i in 1:10000)
cat(i)
return(1)
}
Когда я вызываю f()
, существует ли способ остановить печать cat
на экране (без изменения функции в любом случае)?
Причина этого вопроса
Мои ученики загружают свои R файлы. Затем я запускаю скрипты и проверяю, верны ли они. Каждый так часто студент уходит в команду cat
. Это особенно раздражает, когда он в длинном цикле
В Linux вы можете использовать вызов sink()
для /dev/null
(или во временный файл на другой ОС, см. ?tempfile
):
sink(file="/dev/null")
f()
sink()
Это должно работать?
oldcat = cat
cat = function( ..., file="", sep=" ", fill=F, labels=NULL, append=F ) {}
f()
cat = oldcat
Просто замените cat
пустым function
, а затем установите его на завершение
Вот забавный хак, который комментирует все 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()
.
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()