接收器不会释放文件

时间:2013-09-10 23:45:02

标签: r sink

我知道可以使用sink()函数将R输出转移到文件中,例如

sink('sink-closing.txt')
cat('Hello world!')
sink()

是否有一个简单的命令来关闭所有未完成的接收器?

下面,我详细说明我的问题。

假设我的R脚本在R脚本中打开sink(),但在脚本关闭sink()之前R脚本中出现错误。我可能多次运行R脚本,试图修复错误。最后,我想关闭所有接收器并打印到控制台。我该怎么做?

最后,为了具体,我提供了一个MWE来说明我面临的问题。

首先,我编写了一个R脚本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脚本,在我尝试查找并修复错误时,错误地说了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脚本并想要打印到控制台。我可以多次拨打sink()来关闭之前的接收器。如果我调用它3次,那么我最终可以像以前一样打印到控制台。但我如何知道需要关闭多少水槽呢?

3 个答案:

答案 0 :(得分:34)

您可以使用sink.number()告诉您已经设置了多少次转移,然后多次拨打sink。把它放到一个函数中你可以拥有这个

sink.reset <- function(){
    for(i in seq_len(sink.number())){
        sink(NULL)
    }
}

答案 1 :(得分:30)

closeAllConnections()   # .........................

答案 2 :(得分:9)

根据@ 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.

修改 sink抛出警告而不是错误,所以我修改了代码,使它不会永远运行,哎呀!