Помимо короткого замыкания, упомянутого в других ответах, Or
/ And
можно использовать как побитовые операторы, где OrElse
/ AndAlso
нет. Побитовые операции включают объединение значений перечислений флагов, таких как перечисление FileAttributes , где вы можете указать, что файл является только для чтения и скрыт FileAttributes.ReadOnly Or FileAttributes.Hidden
В Linux вы можете использовать вызов sink()
для /dev/null
(или во временный файл в другой ОС, см. ?tempfile
):
sink(file="/dev/null")
f()
sink()
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()
Вот забавный хак, который комментирует все функции cat()
в функции. Не уверен, что это дает ошибки или нарушает функцию:
foo <- deparse(f)
f <- eval(parse(text=gsub("cat","#cat",foo)))
f()
[1] 1
Другой вариант - это, в основном, ответ Джубы с использованием раковины, но вы можете использовать пакет Defaults
для изменения поведения по умолчанию cat
. Аргумент file
в основном сводит его вывод в файл. Итак:
library("Defaults")
setDefaults(cat,file="sink.txt")
f()
Гарантирует, что только выходной сигнал cat
, а не print
или так погружен. Однако это значительно сокращает время выполнения, так как теперь файл открывается и закрывается каждый раз cat()
.
gsub("^cat$", "#cat", foo)
– aL3xa
15 March 2011 в 13:54
Это должно работать?
oldcat = cat
cat = function( ..., file="", sep=" ", fill=F, labels=NULL, append=F ) {}
f()
cat = oldcat
Просто замените cat
на пустой function
, а затем установите его на завершение
cat <- list
, пока функция cat
появляется только в функциях.
– G. Grothendieck
15 March 2011 в 16:31
cat <- list
кажется немного тупым. Я уверен, что мне нужно будет прочитать это 3-4 раза, чтобы вспомнить, что я делаю ...
– tim_yates
15 March 2011 в 16:41
rm(cat)
также восстановит cat
удаление версии в глобальной среде, чтобы она не замаскировала версию в базе. Также мы можем устранить необходимость в oldcat
, поскольку на нее всегда можно ссылаться как base::cat
.
– G. Grothendieck
29 December 2015 в 13:29
sink
очень полезен. Однако он также снизит возвращаемое значение функции. – Sacha Epskamp 15 March 2011 в 12:20f()
объекту. – Gavin Simpson 15 March 2011 в 12:57capture.output(x <- f())
– hadley 15 March 2011 в 15:27