Sink не выпускает файл
Я знаю, что функция sink()
может использоваться для переадресации вывода R в файл, например.
sink('sink-closing.txt')
cat('Hello world!')
sink()
Есть ли простая команда для закрытия всех выдающихся приемников?
Ниже я подробно излагаю свой вопрос.
Предположим, что мой R- script открывает a sink()
в R- script, но в R- script есть ошибка, которая возникает до того, как script закрывает sink()
. Я могу запустить R- script несколько раз, пытаясь исправить ошибку. Наконец, я хочу закрыть все раковины и распечатать на консоли. Как это сделать?
Наконец, в интересах конкретности я предоставляю MWE для иллюстрации проблемы, с которой я сталкиваюсь.
Во-первых, я пишу R- script sink-closing.R
, в котором есть ошибка.
sink('sink-closing.txt')
foo <- function() {
cat(sprintf('Hello world! My name is %s\n',
a.variable.that.does.not.exist))
}
foo()
sink()
Далее я source
R- script несколько раз, скажем, 3 раза по ошибке, поскольку я пытаюсь найти и исправить ошибку.
> source('~/Dropbox/cookbook/r-cookbook/sink-closing.R')
Error in sprintf("Hello world! My name is %s\n", a.variable.that.does.not.exist) :
object 'a.variable.that.does.not.exist' not found
Теперь предположим, что я отлаживаю R- script и хочу печатать на консоли. Я могу вызвать sink()
несколько раз, чтобы закрыть ранние приемники. Если я назову это 3 раза, то я могу, наконец, распечатать на консоли. Но как я узнаю, сколько стоков мне нужно закрыть?
Ответы
Ответ 1
Вы можете использовать sink.number()
, чтобы рассказать вам, сколько настроек уже установлено, а затем многократно нажимайте sink
. Введя его в функцию, вы могли бы это сделать
sink.reset <- function(){
for(i in seq_len(sink.number())){
sink(NULL)
}
}
Ответ 2
closeAllConnections() # .........................
Ответ 3
На основании комментария @mnel:
sinkall <- function() {
i <- sink.number()
while (i > 0) {
sink()
i <- i - 1
}
}
Закройте все открытые раковины.
Вы также можете столкнуться с этой проблемой при работе с устройствами и графиками, где количество открытых устройств не сообщается нигде. Для более общего случая вы можете использовать это:
stopWhenError <- function(FUN) {
tryCatch({
while(TRUE) {
FUN()
}
}, warning = function(w) {
print("All finished!")
}, error = function(e) {
print("All finished!")
})
}
stopWhenError(sink) # for sink.
stopWhenError(dev.off) # close all open plotting devices.
EDIT:
sink
выдает предупреждение, а не ошибку, поэтому я изменил код так, чтобы он не запускался вечно, whoops!