Как отключить вывод из этого пакета R?

#r

#r

Вопрос:

Я немного поиграл с LowRankQP() пакетом в R, и даже настройка verbose=FALSE по-прежнему выдает много выходных данных (см. Пример ниже).

Выходные данные поступают из скомпилированной части кода. Есть ли способ (функция переноса?) чтобы в R выполнить вызов LowRankQP() абсолютно беззвучного (т. Е. ничего не выводить на экран) без изменения базового скомпилированного кода (ни один из адресов электронной почты, связанных с этим пакетом, все еще активен)?

 library(LowRankQP)

Vmat <- matrix(0,6,6)
diag(Vmat) <- c(1, 1,1,0,0,0)
dvec <- c(0,-5,0,0,0,0)
Amat <- matrix(c(-4,-3,0,-1,0,0,2,1,0,0,-1,0,0,-2,1,0,0,-1),6,3)
bvec <- c(-8,2,0)
uvec <- c(100,100,100,100,100,100)

aa<-LowRankQP(Vmat,dvec,t(Amat),bvec,uvec,method="CHOL")

# LowRankQP CONVERGED IN 15 ITERATIONS
# 
#     Primal Feasibility    =   2.5719308e-16
#     Dual Feasibility      =   7.1949984e-16
#     Complementarity Value =   3.3066705e-11
#     Duality Gap           =   3.3065273e-11
#     Termination Condition =   9.7802929e-12
  

Я хочу отказаться от части, которая начинается с «LowRankQP СХОДИЛСЯ За 15 ИТЕРАЦИЙ»..

Ubuntu 11.04, R версии 2.12.1 и LowRankQP() 1.0.1.

Комментарии:

1. Пожалуйста, добавьте воспроизводимый пример. У меня нет проблем с этим из нескольких тестов, которые я провел.

2. Не воспроизводимо в Windows, я вообще не получаю никаких выходных данных. Пожалуйста, 1) обновите до последней версии и 2) если это не устранится, сообщите разработчикам пакета. Это пахнет какой-то ошибкой / несоответствием между версиями Linux и Windows.

3. Спасибо J.M. (я уже запускаю R / последнюю версию пакета, поэтому отправлю разработку по почте).

4. По-видимому, пакет больше не поддерживается активно (адрес за сопровождающим недоступен).

Ответ №1:

приемник (file=NULL) не работает, поскольку он закрывает последний приемник, не более того.

предупреждающее сообщение о приемнике (file = NULL): В приемнике (file = NULL): нет приемника для удаления

Что действительно работает, хотя это:

 f = file()
sink(file=f) ## silence upcoming output using anonymous file connection
... your code here ...
sink() ## undo silencing
close(f)
  

Преимущество использования анонимного файла заключается в том, что он не зависит от платформы, т. Е. вам не нужно придумывать временное имя файла.

Пример:

 f = file()
sink(file=f)
example(glm)
sink()
close(f)
  

Я успешно использовал sink () для других функций (например, normalmixEM2comp {mixtools}).

(редактировать: первая версия этого сообщения не использовала явный дескриптор файла и, следовательно, выдавала предупреждение — или даже ошибку, если вы вызываете приведенный выше фрагмент достаточно часто). Теперь это исправлено с помощью close (f).

Ответ №2:

Вы знакомы с функцией R sink() ? Со страницы справки:

 sink                   package:base                    R Documentation

Send R Output to a File

Description:

     ‘sink’ diverts R output to a connection.

     ‘sink.number()’ reports how many diversions are in use.

     ‘sink.number(type = "message")’ reports the number of the
     connection currently being used for error messages.

Usage:

     sink(file = NULL, append = FALSE, type = c("output", "message"),
          split = FALSE)

     sink.number(type = c("output", "message"))

Arguments:

    file: a writable connection or a character string naming the file
          to write to, or ‘NULL’ to stop sink-ing.
  

file=NULL Аргумент — это то, что вам может понадобиться здесь.

Комментарии:

1. спасибо D.E. Знаете ли вы какой-либо способ избежать того, чтобы эти распечатки также попадали в окно терминала — это очень раздражает?

2. sink(file=NULL) означает ли это, что весь вывод переходит в NULL.

3. Спасибо D.E.: тогда я не смог это использовать: где в приведенном выше коде я должен был использовать sink (file = NULL), чтобы сообщение не выводилось на экран?

4. Перед вызовом команд, которые генерируют вывод, вы должны подавить его. Вы читали страницу справки для sink() ?

5. Также довольно иронично, что вы настаиваете на том, чтобы называть всех по их инициалам, когда а) здесь никто не подписывается своими инициалами и б) вы сами прячетесь за анонимным дескриптором.

Ответ №3:

Хорошо, я мог бы сделать это, закомментировав строки 413-> 418 LowRankQP.c и переустановив его из .tar.gz (или, альтернативно, добавление новой опции verbose ==2).

Ответ №4:

Основываясь на ответе cbielow, вот небольшая функция, которая отключает cat() and print() (но не message() or warning() ) и возвращает все, что вернуло выражение:

 shut_up = function(expr) {
  #temp file
  f = file()

  #write output to that file
  sink(file = f)

  #evaluate expr in original environment
  y = eval(expr, envir = parent.frame())

  #close sink
  sink()

  #get rid of file
  close(f)

  y
}
  

Тесты:

 > shut_up(print(1))
[1] 1
> shut_up(cat(1))
NULL
> shut_up(message(1))
1
NULL
> shut_up(warning(1))
[1] "1"
Warning message:
In eval(expr, envir = parent.frame()) : 1
  

Обратите внимание, что вывод возвращается для print() и warning() , потому что эти функции автоматически возвращают свои входные данные, в то время как cat() и message() возвращают NULL .

Ответ №5:

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

Комментарии:

1. Все, что на самом деле делает невидимое, это предотвращает печать возвращаемого значения его содержимого, так что это не должно помочь.