#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. Все, что на самом деле делает невидимое, это предотвращает печать возвращаемого значения его содержимого, так что это не должно помочь.