Подтвердить что ты не робот

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 раза, то я могу, наконец, распечатать на консоли. Но как я узнаю, сколько стоков мне нужно закрыть?

4b9b3361

Ответ 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!