Придушити вихід функції


90

Я хочу придушити вихід однієї команди (у цьому випадку applyфункції).

Чи можна це зробити без використання sink()? Я знайшов описане рішення нижче, але хотів би зробити це в один рядок, якщо це можливо.

Як придушити вихід


2
Чи можете ви пояснити, що ви маєте на увазі під цим словом? В іншому випадку питання, яке ви цитуєте, вже надає відповідь, і це дублікат.
Dirk Eddelbuettel

1
Це рішення вимагає трьох рядків, один переспрямовуючий вихід, команду, а потім інший, щоб знову увімкнути вихід.
Tor

8
Або використовувати capture.output. Або скористайтеся *_plyпакетом plyr.
Hadley

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

Відповіді:


92

Незрозуміло, чому ви хочете зробити це без sink, але ви можете обернути будь-які команди у invisible()функції, і це придушить вихід. Наприклад:

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

В іншому випадку ви завжди можете об’єднати речі в один рядок із крапкою з комою та дужками:

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

5
Спробуйте 'invisible (cat ("Привіт \ n"))' - invisible()лише придушує друк виразу, він не є sink()однорядковим.
Dirk Eddelbuettel

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 або NULWindows. Наприклад, розглядаючи примітку Дірка:

> 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

9

R лише автоматично друкує висновок неприсвоєних виразів, тому просто призначте результат applyзмінної змінній, і вона не надрукується .


4
У деяких функціях є print()або, cat()що переходить на екран, а не на призначення.
keithpjolley

9

Наступна функція повинна робити те, що ви хочете:

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

саме те, що мені теж потрібно було
gaspar

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 пакетом reprex (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.