Подавить вывод функции


91

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

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

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


2
Можете ли вы объяснить, что вы имеете в виду, говоря «сделать это встроенным»? В противном случае вопрос, который вы цитируете, уже дает ответ, и это дубликат.
Дирк Эддельбюттель

1
Для этого решения требуется три строки, одна перенаправляет вывод, команда, а затем другая, чтобы снова включить вывод.
Tor

8
Или используйте capture.output. Или используйте *_plyиз пакета plyr.
Хэдли

1
Я повторяю предложение Хэдли - если вы действительно пытаетесь выполнить функцию применения, например lapply, без вывода на печать, то l_ply из его plyrпакета, вероятно, будет наиболее подходящим выбором.
Sharpie

Ответы:


93

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

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

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

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

5
Попробуйте 'invisible (cat ("Hi \ n"))' - invisible()подавляет только печать выражения, это не sink()однострочный текст.
Дирк Эддельбюттель

2
Верно, но я думаю, что это отвечает потребностям вопрошающего, если я не упускаю что-то в вопросе ...
Шейн

1
Например, это подавляет возвращение apply, в соответствии с вопросом: invisible(apply(matrix(1:10), 1, as.numeric)).
Шейн

Вместо того, чтобы { sink("/dev/null"); ....; sink(); }я определенно предпочел capture.output, как это capture.outputфактически сделано точно выше, просто намного лучше (посмотрите на источник, он вызывает сток, как описано выше, плюс некоторые приятные вещи вокруг него).
Cookie

3
не работает idwпод Windows. Я думаю, что лучшим решением будет использованиеsink
TMS

58

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

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

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

10
не работает, если вы хотите применить это к функции, которая возвращает какое-то значение, и вы хотите использовать это значение
TMS

8
@TMS Что-то изменилось за последние несколько месяцев? Я только что протестировал, чтобы использовать значение, возвращаемое функцией, и оно сработало ... capture.output(x <- log(2))и после этого xимеет значение log(2)...
drmariod

10

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

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

test$betas

10

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

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!" в STDOUT

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


Это был единственный недооцененный ответ, который сделал то, что мне нужно.
tomka

именно то, что мне тоже нужно
гаспар

9

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


4
В некоторых функциях есть print()или, cat()которые переходят к экрану, а не к назначению.
keithpjolley 08

3

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

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

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


})})
```

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


1

Делаем комментарий Хэдли к ответу (надеюсь, что он будет лучше виден). Использование семейства 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)


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.