2017-06-23 71 views
1

我在R中寫了一個函數來打印任何消息都記錄文件和控制檯。但是,如果在運行代碼時出現任何意外錯誤,則僅向控制檯顯示錯誤。有沒有辦法將錯誤消息寫入控制檯和日誌文件?下面是函數..錯誤處理和登錄R

log_con <- file("Text1.txt", open="a") 

loggerfn<-function(Message,LogConnection=log_con){ 
    cat(Message, file = LogConnection) 
    cat(Message) 
} 

下面是示例代碼...

for (i in 1:10) 
{ 
    loggerfn("loop begins\n",log_con) 
    a <- rnorm(n = 100, mean = i, sd = 5) 
    loggerfn(mean(a),log_con) 
    loggerfn("loop Completed\n",log_con) 
    if(i==8){ 
    sdfs 
    } 
} 

在上面的代碼我特意通過提供未定義的對象sdfd.Below提供錯誤消息引入的誤差僅示出在控制檯中,有沒有辦法將錯誤消息寫入控制檯和日誌文件?

Error: object 'sdfs' not found 
+0

你聽說過在R中使用try-catch塊嗎? –

+0

是的..我正在處理一些重大項目。我無法預測錯誤使用try,catch塊在每個模塊中。 – PPC

回答

1

使用sink()將消息以及警告轉移到文件。關鍵是要設置的參數類型=「消息」

參閱http://www.statmethods.net/interface/io.htmlOutput error/warning log (txt file) when running R script under command line https://stat.ethz.ch/R-manual/R-devel/library/base/html/sink.html

sink()的函數定義了輸出的方向。

描述

水槽轉移R輸出到連接(並停止這種轉移)。

sink.number() 

報告有多少轉移正在使用中。

sink.number(type = "message")報告當前正用於錯誤消息的連接的編號。 用法

sink(file = NULL, append = FALSE, type = c("output", "message"), 
    split = FALSE) 

sink.number(type = c("output", "message")) 

直接輸出到一個文件

sink("myfile", append=FALSE, split=FALSE) 

返回輸出到終端

sink() 

追加選項控制輸出是否會覆蓋或添加到文件中。分割選項決定輸出是否也發送到屏幕以及輸出文件。

下面是一些sink()函數的例子。

輸出指向c:\ projects目錄中的output.txt。 輸出會覆蓋現有文件。沒有輸出到終端。

sink("c:/projects/output.txt") 

輸出指向myfile.txt在cwd。輸出附加到現有文件 。輸出也發送到終端。

sink("myfile.txt", append=TRUE, split=TRUE) 

重定向輸出時,使用cat()函數來標註輸出。

+1

我已經嘗試了下面的代碼,它沒有寫入錯誤消息(_Error:object'sdfs'not found_)來記錄文件。你能檢查一下嗎? (「我在1:10」) cat(「循環開始\」)(sink)(「myfile.txt」,append = TRUE,split = TRUE) sink.number(type = c(「output」 (平均(a)) cat(「loop已完成\ n」) if(i == 8){sdfs} 如果(i == 8){sdfs} a < - rnorm(n = 100,mean = i,sd = 5) } sink()' – PPC