2014-09-20 72 views
2

我想捕獲我的R腳本的完整控制檯日誌。我想要按時間順序排列所有事物,並在發生時印刷警告。我試過這個:如何使用控制檯輸出捕獲警告?

options(warn = 1) 

tmpSinkfileName <- tempfile() 
sink(tmpSinkfileName, split = TRUE) 

cat("Doing something\n") 
warning("Hi here") 
cat("Doing something else\n") 
warning("Hi there") 

sink() 
console.out <- readChar(tmpSinkfileName, file.info(tmpSinkfileName)$size) 
unlink(tmpSinkfileName) 

cat(console.out) 
# Doing something 
# Doing something else 
warnings() 
# NULL 

但不幸的是在console.out中缺少警告。我怎樣才能做到這一點?根據文檔,options(warn = 1)應該在發生警告時進行打印。不幸的是,他們沒有被sink()捕獲。

+0

的r CMD BATCH script.R'產生具有完整的會話的文件script.Rout;也許這與你的用例一致? ('R CMD BATCH --vanilla --silent'以避免意外加載保存的工作空間並避免啓動畫面)。 – 2014-09-20 12:55:13

回答

3

幾乎得到它,但它非常複雜,與標準輸出不同,消息輸出不能被拆分,即重定向到文件並同時保存在輸出中(UNIX tee行爲)!

options(warn = 1) 

tmpSinkfileName <- tempfile() 
tmpFD <- file(tmpSinkfileName, open = "wt") 
sink(tmpFD, split = TRUE) 
sink(tmpFD, type = "message") 

cat("Doing something\n") 
warning("Hi here") 
cat("Doing something else\n") 
warning("Hi there") 

sink(type = "message") 
sink() 
console.out <- readChar(tmpSinkfileName, file.info(tmpSinkfileName)$size) 
unlink(tmpSinkfileName) 

cat(console.out) 

如果我嘗試

sink(tmpFD, type = "message", split = TRUE) 

錯誤在水槽(tmpFD,類型= 「消息」,分裂= TRUE)表示:不能分割 的消息連接

這非常討厭!

3

我寫下面的函數來捕獲輸出中和消息:

create_log <- function(logfile_name, path) { 
    if (file.exists(paste0(path, logfile_name))) { 
    file.remove(paste0(path, logfile_name)) 
    } 
    fid <- file(paste0(path, logfile_name), open = "wt") 
    sink(fid, type = "message", split = F) 
    sink(fid, append = T, type = "output", split = T) 
    warning("Use closeAllConnections() in the end of the script") 
}