我知道可以使用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次,那么我最终可以像以前一样打印到控制台。但我如何知道需要关闭多少水槽呢?
答案 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
抛出警告而不是错误,所以我修改了代码,使它不会永远运行,哎呀!