如果我從命令行(R --slave script.R)運行一個很長的R腳本,如何才能讓它在錯誤時給出行號?R腳本錯誤的行號?
我不想調試命令,如果在所有可能添加到腳本 - 我只想R鍵行爲像大多數其他腳本語言...
如果我從命令行(R --slave script.R)運行一個很長的R腳本,如何才能讓它在錯誤時給出行號?R腳本錯誤的行號?
我不想調試命令,如果在所有可能添加到腳本 - 我只想R鍵行爲像大多數其他腳本語言...
這不會給你的行號,但它會告訴你在哪裏失敗調用堆棧發生,這是非常有幫助的:
traceback()
[編輯:]當在命令行中運行腳本,你將不得不跳過一個或兩個電話,看traceback() for interactive and non-interactive R sessions
我不知道的另一種方式來做到這一點,沒有通常的調試嫌疑人:
You might want to look at this related post.
[編輯:]對不起......剛纔看到你在命令行中運行此。在這種情況下,我會建議使用選項(錯誤)功能。這裏有一個簡單的例子:
options(error = quote({dump.frames(to.file=TRUE); q()}))
,只要你想在出錯時您可以創建複雜的腳本,所以你只要決定你需要什麼樣的信息進行調試。否則,如果存在特定的關注區域(例如連接到數據庫),則將它們包裝在tryCatch()函數中。
R 2.10及更高版本即將支持此操作。鄧肯默多克剛剛發佈到R-devel的在2009年9月10日約findLineNum and setBreapoint:
I've just added a couple of functions to R-devel to help with
debugging. findLineNum() finds which line of which function corresponds
to a particular line of source code; setBreakpoint() takes the output of
findLineNum, and calls trace() to set a breakpoint there.
These rely on having source reference debug information in the code.
This is the default for code read by source(), but not for packages. To
get the source references in package code, set the environment variable
R_KEEP_PKG_SOURCE=yes, or within R, set options(keep.source.pkgs=TRUE),
then install the package from source code. Read ?findLineNum for
details on how to
tell it to search within packages, rather than limiting the search to
the global environment.
For example,
x <- " f <- function(a, b) {
if (a > b) {
a
} else {
b
}
}"
eval(parse(text=x)) # Normally you'd use source() to read a file...
findLineNum("<text>#3") # <text> is a dummy filename used by parse(text=)
This will print
f step 2,3,2 in <environment: R_GlobalEnv>
and you can use
setBreakpoint("<text>#3")
to set a breakpoint there.
There are still some limitations (and probably bugs) in the code; I'll
be fixing thos
有每日r-devel來源(和Windoze的二進制文件)... – 2009-09-18 21:56:23
謝謝。剛剛註冊了r-devel郵件列表。我一直在避免r-help,因爲它會阻塞我的收件箱(r-sig-finance已經這麼做)。 – Shane 2009-09-19 16:01:33
真的不明白這是如何從命令行工作,而不需要在R腳本中打字 – 2016-05-25 21:21:34
做options(error=traceback)
提供了有關領導到錯誤的線的內容多一點的信息。如果出現錯誤,它會導致回溯,對於某些錯誤,它會有行號,前綴爲#
。但是它被擊中或錯過,許多錯誤不會得到行號。
對我來說這不太合適。我只有一個文件,並沒有顯示行號,只是說錯誤發生後沒有可用的蹤跡。 – 2016-03-24 23:42:59
@MarkLakata記住這是從2012年開始的一個答案,這是5年前... – 2017-03-28 09:12:56
您可以通過設置做
options(show.error.locations = TRUE)
我只是想知道爲什麼這個設置不是R中默認?它應該像其他語言一樣。
有關此選項的背景信息,請參閱https://stat.ethz.ch/R-manual/R-devel/library/base /html/options.html – 2016-10-12 10:52:27
這用於工作,但因爲不可靠而被禁用。我認爲這是企圖迫使你使用RStudio,它最終將是非免費的。 – 2017-03-28 06:48:22
我對此表示懷疑。 R核心和RStudio是非常不同的組織,R核心尤其是開源軟件。 – 2017-03-28 15:40:48
指定用於處理非災難性錯誤的全局R選項,以及用於保留有關錯誤的信息並在失敗後檢查此信息的自定義工作流程。我目前正在運行R版本3.4.1。 下面,我已經包含了對我工作的工作流程的描述,以及我用於在R中設置全局錯誤處理選項的一些代碼。
由於我配置了錯誤處理,所以錯誤處理還會創建一個包含錯誤發生時工作內存中所有對象的RData文件。此轉儲可使用load()
,然後將各種環境,因爲它們在誤差時存在可以交互使用debugger(errorDump)
被檢查被讀回成R。
我會注意到,我能夠在堆棧內的任何自定義功能traceback()
輸出得到行號,但只有當我打電話source()
在我的腳本中使用的任何自定義函數時使用的keep.source=TRUE
選項。如果沒有此選項,請按如下所示設置全局錯誤處理選項,將traceback()
的完整輸出發送到名爲error.log
的錯誤日誌,但行號不可用。
這是我參加了我的工作流程的一般步驟,以及如何我能非交互式[R失敗後訪問內存轉儲和錯誤日誌。
我把以下放在我從命令行調用的主腳本的頂部。這爲R會話設置了全局錯誤處理選項。我的主要腳本被稱爲myMainScript.R
。代碼中的各行對它們進行評論,描述它們的功能。基本上,使用此選項,當R遇到觸發stop()
一個錯誤,它會創建一個RDATA(* .rda)轉儲目錄~/myUsername/directoryForDump
在所有活動的環境中工作記憶的文件,也寫了一些有用的命名error.log
錯誤日誌信息到同一個目錄。您可以修改此片段以在錯誤時添加其他處理(例如,將時間戳添加到轉儲文件和錯誤日誌文件名等)。
options(error = quote({
setwd('~/myUsername/directoryForDump'); # Set working directory where you want the dump to go, since dump.frames() doesn't seem to accept absolute file paths.
dump.frames("errorDump", to.file=TRUE, include.GlobalEnv=TRUE); # First dump to file; this dump is not accessible by the R session.
sink(file="error.log"); # Specify sink file to redirect all output.
dump.frames(); # Dump again to be able to retrieve error message and write to error log; this dump is accessible by the R session since not dumped to file.
cat(attr(last.dump,"error.message")); # Print error message to file, along with simplified stack trace.
cat('\nTraceback:');
cat('\n');
traceback(2); # Print full traceback of function calls with all parameters. The 2 passed to traceback omits the outermost two function calls.
sink();
q()}))
確保從主腳本和任何後續函數調用,隨時隨地的函數來源,選項keep.source=TRUE
使用。也就是說,要獲得一個函數,你可以使用source('~/path/to/myFunction.R', keep.source=TRUE)
。這是traceback()
輸出包含行號所必需的。看起來您也可以使用options(keep.source=TRUE)
在全局範圍內設置此選項,但是我沒有測試過這個選項是否有效。如果你不需要行號,你可以省略這個選項。
Rscript myMainScript.R
在批處理模式下的主要腳本。這將啓動一個新的非交互式R會話並運行腳本myMainScript.R
。已放置在myMainScript.R
頂部的步驟1中給出的代碼片段爲非交互式R會話設置了錯誤處理選項。myMainScript.R
執行中的某處遇到錯誤。這可能在主腳本本身,或深層嵌套幾個功能。遇到錯誤時,將按照步驟1中的說明執行處理,並且R會話將終止。'~/myUsername/directoryForDump'
指定的目錄中創建名爲errorDump.rda
的RData轉儲文件和名爲error.log
的錯誤日誌。在您的休閒,檢查error.log
審查有關錯誤的信息,包括錯誤消息本身和完整堆棧跟蹤導致錯誤。以下是錯誤生成的日誌示例;注意#
字符後面的數字是錯誤的行號在調用棧的不同點:
Error in callNonExistFunc() : could not find function "callNonExistFunc"
Calls: test_multi_commodity_flow_cmd -> getExtendedConfigDF -> extendConfigDF
Traceback:
3: extendConfigDF(info_df, data_dir = user_dir, dlevel = dlevel) at test_multi_commodity_flow.R#304
2: getExtendedConfigDF(config_file_path, out_dir, dlevel) at test_multi_commodity_flow.R#352
1: test_multi_commodity_flow_cmd(config_file_path = config_file_path,
spot_file_path = spot_file_path, forward_file_path = forward_file_path,
data_dir = "../", user_dir = "Output", sim_type = "spot",
sim_scheme = "shape", sim_gran = "hourly", sim_adjust = "raw",
nsim = 5, start_date = "2017-07-01", end_date = "2017-12-31",
compute_averages = opt$compute_averages, compute_shapes = opt$compute_shapes,
overwrite = opt$overwrite, nmonths = opt$nmonths, forward_regime = opt$fregime,
ltfv_ratio = opt$ltfv_ratio, method = opt$method, dlevel = 0)
在您的休閒,你可以加載到errorDump.rda
使用load('~/path/to/errorDump.rda')
一個互動R對話。加載後,請撥打debugger(errorDump)
以瀏覽任何活動環境中內存中的所有R對象。有關更多信息,請參閱debugger()
上的R幫助。
該工作流在某些類型的生產環境中,你必須在命令行正在啓動非交互式的R會話,你想保留意想不到的錯誤信息運行R是很大的幫助。將內存轉儲到錯誤發生時可用於檢查工作內存的文件以及調用堆棧中錯誤的行號,可以快速調試導致錯誤的原因。
有沒有更新?四年後,似乎問題仍然存在,儘管所有的主流R被採用。 – 2013-09-15 00:41:43
我也有很長的R腳本,有很多小輸出,我想打印(下劃線)(下劃線)LINE/FILE(下劃線) (下劃線)(行號和腳本名稱),而不是將行號硬編碼到源代碼中。 – mosh 2016-11-18 16:05:55
我不知道R內部是否真的有'行號'的概念。但是,它確實具有完成任務的概念,即頂級任務。例如,可以輕鬆定義一個任務處理程序來告訴哪個頂級任務失敗。當然,對於那些擁有大型連鎖店或大條件聲明的人來說,這並不是很大的安慰。 – russellpierce 2017-06-22 12:50:05