Подавить вывод одной команды в R

Я ищу, чтобы подавить вывод одной команды (в этом случае apply функция).

Можно ли сделать это без использования sink()? Я нашел описанное решение ниже, но хотел бы сделать это в одну строку, если это возможно.

Как подавить вывод

11 ответов

Решение

Не понятно, почему вы хотите сделать это без sink, но вы можете обернуть любые команды в invisible() функция, и она будет подавлять вывод. Например:

1:10 # prints output
invisible(1:10) # hides it

В противном случае вы всегда можете объединить вещи в одну строку с точкой с запятой и круглыми скобками:

{ sink("/dev/null"); ....; sink(); }

Использовать capture.output() функция. Это работает очень как разовый sink() и в отличие от invisible()Это может подавить больше, чем просто печатать сообщения. Установите аргумент файла в /dev/null в UNIX или NUL на окнах. Например, учитывая записку Дирка:

> invisible(cat("Hi\n"))
Hi

> capture.output( cat("Hi\n"), file='NUL')
> 

Следующая функция должна делать то, что вы хотите точно:

hush=function(code){
  sink("NUL") # use /dev/null in UNIX
  tmp = code
  sink()
  return(tmp)
}

Например, с помощью функции здесь:

foo=function(){
  print("BAR!")
  return(42)
}

Бег

x = hush(foo())

Назначит 42 для x, но не будет печатать "BAR!" вычеркнуть

Обратите внимание, что в ОС UNIX вам нужно заменить "NUL" на "/dev/null"

R только автоматически печатает вывод неназначенных выражений, поэтому просто присвойте результат apply в переменную, и она не будет напечатана.

Вы можете использовать "capture.output", как показано ниже. Это позволяет вам использовать данные позже:

log <- capture.output({
  test <- CensReg.SMN(cc=cc,x=x,y=y, nu=NULL, type="Normal")
})

test$betas

Если кто-то прибывает сюда в поисках решения, применимого к RMarkdown, это подавит весь вывод:

```{r error=FALSE, warning=FALSE, message=FALSE}
invisible({capture.output({

# Your code goes here
2 * 2
# etc
# etc


})})
```

Код будет запущен, но вывод не будет напечатан в HTML-документе.

Делаем комментарий Хэдли к ответу (надеюсь, что он будет лучше виден). Использование семейства apply без печати возможно с использованиемplyr пакет

x <- 1:2
lapply(x, function(x) x + 1)
#> [[1]]
#> [1] 2
#> 
#> [[2]]
#> [1] 3

plyr::l_ply(x, function(x) x + 1)

Создано 2020-05-19 пакетом REPEX (v0.3.0)

invisible(cat("Dataset: ", dataset, fill = TRUE))
invisible(cat(" Width: " ,width, fill = TRUE))
invisible(cat(" Bin1:  " ,bin1interval, fill = TRUE))
invisible(cat(" Bin2:  " ,bin2interval, fill = TRUE))
invisible(cat(" Bin3:  " ,bin3interval, fill = TRUE))

производит вывод без NULL в конце строки или на следующей строке

Dataset:  17 19 26 29 31 32 34 45 47 51 52 59 60 62 63
Width:  15.33333

Bin1:   17 32.33333
Bin2:   32.33333 47.66667
Bin3:   47.66667 63

для части возврата (что-то) внутри функции R:

      return(invisible(something))  

работает нормально

      invisible(return(something))

не работает вообще

Если вам интересно, как подавитьwarning()вы можете использоватьsuppressWarnings()вот так:

      suppressWarnings(warning("hi"))

В то время как эти два по-прежнему будут показывать предупреждение:

      invisible(warning("Hi"))
# shows 'Hi'

capture.output(warning("Hi"), file='NUL')
# shows 'Hi'

Вот версия, устойчивая к ошибкам в коде, который нужно зашумить:

      quietly <- function(x) {
  sink("/dev/null") # on Windows (?) instead use `sink("NUL")`
  tryCatch(suppressMessages(x), finally = sink())
}
  • Это основано непосредственно на принятом ответе , за что спасибо.
  • Но это позволяет избежать отключения вывода, если в отключенном коде возникает ошибка.
Другие вопросы по тегам