Сделать функцию возвратом беззвучно ВКЛЮЧАЯ удаление строки выполнения txt [дубликат]

Помимо короткого замыкания, упомянутого в других ответах, Or / And можно использовать как побитовые операторы, где OrElse / AndAlso нет. Побитовые операции включают объединение значений перечислений флагов, таких как перечисление FileAttributes , где вы можете указать, что файл является только для чтения и скрыт FileAttributes.ReadOnly Or FileAttributes.Hidden

12
задан csgillespie 15 March 2011 в 11:46
поделиться

4 ответа

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

sink(file="/dev/null")
f()
sink()
18
ответ дан MichaelChirico 21 August 2018 в 21:14
поделиться
  • 1
    sink очень полезен. Однако он также снизит возвращаемое значение функции. – Sacha Epskamp 15 March 2011 в 12:20
  • 2
    @Sacha очевидным решением для этого является назначение вывода из f() объекту. – Gavin Simpson 15 March 2011 в 12:57
  • 3
    Конечно, конечно :) – Sacha Epskamp 15 March 2011 в 13:00
  • 4
    Или в одной строке capture.output(x <- f()) – hadley 15 March 2011 в 15:27

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()
1
ответ дан Artem Klevtsov 21 August 2018 в 21:14
поделиться

Вот забавный хак, который комментирует все функции 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().

2
ответ дан Sacha Epskamp 21 August 2018 в 21:14
поделиться

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

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

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

4
ответ дан tim_yates 21 August 2018 в 21:14
поделиться
  • 1
    cat <- function(...) {} будет проще – hadley 15 March 2011 в 15:27
  • 2
    или даже cat <- list, пока функция cat появляется только в функциях. – G. Grothendieck 15 March 2011 в 16:31
  • 3
    cat <- list кажется немного тупым. Я уверен, что мне нужно будет прочитать это 3-4 раза, чтобы вспомнить, что я делаю ... – tim_yates 15 March 2011 в 16:41
  • 4
    rm(cat) также восстановит cat удаление версии в глобальной среде, чтобы она не замаскировала версию в базе. Также мы можем устранить необходимость в oldcat, поскольку на нее всегда можно ссылаться как base::cat. – G. Grothendieck 29 December 2015 в 13:29
Другие вопросы по тегам:

Похожие вопросы: