Norman Matloff 和PeteSalzman在其著作《TheArt of Debugging, withGDB,DDD,Eclipse》中曾說過,確認原則是調(diào)試的本質(zhì)。程序員編寫程序是為實現(xiàn)特定目的,而一個程序可以由許多目的組成,調(diào)試是確認某些目的是否達到了,如果未能達到目的,那么便可通過在調(diào)試中查看變量,發(fā)現(xiàn)問題癥結(jié),進而解決問題。 在R中進行debug有幾種不同方式,你如果使用諸如Rstudio等圖形軟件,調(diào)試代碼很容易,所有的調(diào)試都在圖形界面下完成,你只需要根據(jù)需求在圖形界面下點擊相應選項來進行斷點設置、單步執(zhí)行、查看變量等操作,查找問題癥結(jié)。但如果在命令行界面下調(diào)試R代碼,那就得要借助于一些特別的調(diào)試工具。R的基礎軟件包base中包含了一些基本的調(diào)試工具,當然CRAN中也有一些其它優(yōu)秀的調(diào)試工具。 對于一般用戶來說,掌握base中的基本調(diào)試工具就能滿足大部分需求,下面介紹R基本軟件包base中的調(diào)試工具的使用方法(也包含setBreakpoint(),其位于utils包中)。 由于在啟動和關(guān)閉調(diào)試中需要用到部分調(diào)試命令,這里就先介紹進入調(diào)試模式后需要用到的一些基本命令。 1.基本調(diào)試命令 在進入dedbug調(diào)試狀態(tài)后,命令提示符從>變?yōu)?/span>Browse[d]>(d表示函數(shù)調(diào)用鏈的深度),可以通過一些基本的命令來進行控制:
2啟動和關(guān)閉調(diào)試 R的核心調(diào)試工具由browser構(gòu)成,通過browser,你可以逐行運行代碼,并在運行過程中進行檢查,查看變量。在調(diào)試代碼時,我們首先要讓程序進入調(diào)試狀態(tài),有下列幾種方式可以實現(xiàn)。 2.1 在代碼中的指定位置加入browser() 開啟調(diào)試: 在R源文件中的指定位置插入函數(shù)browser(),保存源文件,運行源程序,程序一旦運行到browser()處,將會自動進入debug狀態(tài)。 取消調(diào)試: 但當用戶完成調(diào)試后,需要手動刪除源文件中的browser()函數(shù),否則每次運行到browser()位置都會進入debug狀態(tài)。 temp_test.R: (PS:此文件在下面會多次用到,所以貼出來,但后續(xù)用到時已經(jīng)刪除了browser())
2.2調(diào)用debug() R的調(diào)試工具是針對單個函數(shù)的,由于擁有函數(shù)式編程的特性,R的每一個運算符,實際上也是函數(shù)(關(guān)于R函數(shù),可參考這里),這里所說的函數(shù)不包括一般的運算符。 開啟調(diào)試: 執(zhí)行命令debug(fun) fun指函數(shù)名,這樣每次調(diào)用函數(shù)fun()都會進入調(diào)試狀態(tài)。 取消調(diào)試: 執(zhí)行命令undebug(fun) 再次調(diào)用函數(shù)fun()將不會進入調(diào)試狀態(tài)。 如下例所示:
2.3調(diào)用debugonce() 同debug()的調(diào)用方式一樣,區(qū)別在于:debugonce()只會在設置之后的第一次調(diào)用時進入調(diào)試狀態(tài)且只只進入一次,而debug()可以進入無限多次直到通過undebug()取消調(diào)試。 2.4用函數(shù)trace()進行跟蹤 trace(fun,tracer) fun表示需要跟蹤或者取消跟蹤的函數(shù)名;racer表示跟蹤的對象,可以是某個函數(shù),也可以是函數(shù)中的某個表達式。 開啟調(diào)試: 執(zhí)行命令trace(fun,tracer) 每次調(diào)用函數(shù)fun(),都會顯示表達式的值,或者對函數(shù)進行某些操作。 取消調(diào)試: 執(zhí)行命令untrace(fun) 取消對某個函數(shù)的跟蹤。 如下例所示:
2.5.設置斷點setBreakpoint() setBreakpoint()位于utils包中,R版本需要>=2.10 setBreakpoint(filename,linenumber) 表示會在源文件filename的第linenumber行設置斷點,但是實際上是通過函數(shù)來進行設置的,這點需要注意,即只有所設置的斷點處于文件中的某個函數(shù)內(nèi)才是有效的。此函數(shù)可以用在debug調(diào)試狀態(tài)中,在單步調(diào)試過程中,當設置了斷點后,可以讓程序直接運行到到斷點處,這在調(diào)試過程中很有用處。 開啟調(diào)試: 執(zhí)行命令setBreakpoint(filename,linenumber) 然后再執(zhí)行代碼,當代碼運行到斷點處即進入調(diào)試狀態(tài)。 取消調(diào)試: 執(zhí)行命令untrace(fun) fun表示函數(shù)名,Breakpoint要設在函數(shù)內(nèi)才有效,所以應當通過函數(shù)來取消斷點,setBreakpoint()是通過調(diào)用trace()發(fā)揮作用的。 如下例所示:
參考: [1] Norman Matloff著,陳堰平等譯.R語言編程藝術(shù).機械工業(yè)出版社,2013-05 |
|