【发布时间】:2013-11-07 13:15:12
【问题描述】:
我实现了以下过程,旨在写入一些文件并在写入完成后在每个文件的末尾打印一条消息:
# Print one file per piaf
output_dir_piafs <- "OUTPUT_dataset_piafs"
unlink(output_dir_piafs, recursive = TRUE, force = TRUE)
dir.create(output_dir_piafs)
for (i in 1:length(lst_sorted)) {
sink() # Generates warnings...
filename <- paste(output_dir_piafs, "/piaf_", i, ".txt", sep="")
sink(file = filename, append = TRUE)
sink(type = "message")
cat(" ", colnames(file1), "\n")
for (j in 1:length(lst_sorted[[i]])) {
cat(j, " ")
lapply( lst_sorted[[i]][[j]],
function(x) {
cat(as.character(x), " ")
}
)
cat("\n")
}
## back to the console
sink()
cat(paste(filename, "done !\n"))
#flush(stdout()) # Tested, no particular effect
}
我的问题是,如果我不在循环的最开始添加sink(),则标准输出(cat(paste(filename, "done !\n")))上的最终写入将无效。另一方面,早点添加sink() 会产生我想避免的警告:
There were 50 or more warnings (use warnings() to see the first 50)
> warnings()
Warning messages:
1: In sink() : no sink to remove
2: In sink() : no sink to remove
3: In sink() : no sink to remove
有人知道 sink() 的行为方式和/或如何消除这些警告吗?
注意:我也试过try(sink(), silent=TRUE),但silent 选项只能防止错误...
【问题讨论】:
-
只是一个愚蠢的想法。您是否从新的 R 会话中尝试过您的代码?也许你有一些连接打开,试试
sink.number("message")。 -
好主意!
sink.number("message")不返回任何内容,但是从一个全新的会话中,标准输出可以正常写入。只有当我停止进程 (Ctrl-C),然后重新运行它时,标准输出才会失败。所以,我认为你是对的。我的坏处:中断进程可能会对stdout连接产生一些不良后果。此外,如果我在重新运行该过程之前输入sink(),它仍然不起作用...... -
我做了一些其他的测试。如果我让进程正确终止,然后重新运行它,一切正常。这绝对是产生问题的
Ctrl-C中断。在以这种方式打断之后,关于如何使事情变得正确有什么建议吗? -
去过那里,做过那个,买了T恤,不喜欢。很高兴您解决了您的问题。
标签: r file stdout keyboardinterrupt sink