Можно ли успокоить команду print () в R? - PullRequest
8 голосов
/ 10 сентября 2010

В R некоторые функции могут печатать информацию и возвращать значения, можно ли отключить печать?

Например:

print.and.return <- function() {
  print("foo")
  return("bar")
}

возвращает

> print.and.return()
[1] "foo"
[1] "bar"
> 

Я могу сохранить возврат как:

> z <- print.and.return()
[1] "foo"
> z
[1] "bar"
> 

Могу ли я подавить печать"foo"

Ответы [ 5 ]

9 голосов
/ 10 сентября 2010
?capture.output
8 голосов
/ 10 сентября 2010

Вы можете использовать скрытую функциональную природу R, например, определив функцию

deprintize<-function(f){
 return(function(...) {capture.output(w<-f(...));return(w);});
}

, которые преобразуют функции «печати» в «тихие»:

noisyf<-function(x){
 print("BOO!");
 sin(x);
}

noisyf(7)
deprintize(noisyf)(7)
deprintize(noisyf)->silentf;silentf(7)
3 голосов
/ 10 сентября 2010

Я согласен с предложением Хэдли и МБК capture.output в качестве наиболее общего решения.Для особого случая написанных вами функций (т. Е. Тех, где вы управляете контентом) используйте message вместо print.Таким образом, вы можете подавить вывод с помощью suppressMessages.

print.and.return2 <- function() {
  message("foo")
  return("bar")
}

# Compare:
print.and.return2()
suppressMessages(print.and.return2())
3 голосов
/ 10 сентября 2010

Если вам абсолютно необходим побочный эффект печати в ваших собственных функциях, почему бы не сделать это опцией?

print.and.return <- function(..., verbose=TRUE) {
  if (verbose) 
    print("foo")
  return("bar")
}


> print.and.return()
[1] "foo"
[1] "bar"
> print.and.return(verbose=FALSE)
[1] "bar"
> 
1 голос
/ 12 марта 2015

Я знаю, что могу воскресить этот пост, но кто-то другой может найти его, как и я.Меня интересовало то же поведение в одной из моих функций, и я только что натолкнулся на «невидимость»:

Он имеет то же значение, что и return(), но просто не печатает возвращенное значение:

invisible(variable)

Таким образом, для примера, приведенного @ayman:

print.and.return2 <- function() {
  message("foo")
  invisible("bar")
}

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...