小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

R語言代碼調(diào)試

 gearss 2018-04-16



      Norman Matloff PeteSalzman在其著作《TheArt of Debugging, withGDB,DDD,Eclipse》中曾說過,確認(rèn)原則是調(diào)試的本質(zhì)。程序員編寫程序是為實(shí)現(xiàn)特定目的,而一個(gè)程序可以由許多目的組成,調(diào)試是確認(rèn)某些目的是否達(dá)到了,如果未能達(dá)到目的,那么便可通過在調(diào)試中查看變量,發(fā)現(xiàn)問題癥結(jié),進(jìn)而解決問題。

    在R中進(jìn)行debug有幾種不同方式,你如果使用諸如Rstudio等圖形軟件,調(diào)試代碼很容易,所有的調(diào)試都在圖形界面下完成,你只需要根據(jù)需求在圖形界面下點(diǎn)擊相應(yīng)選項(xiàng)來進(jìn)行斷點(diǎn)設(shè)置、單步執(zhí)行、查看變量等操作,查找問題癥結(jié)。但如果在命令行界面下調(diào)試R代碼,那就得要借助于一些特別的調(diào)試工具。R的基礎(chǔ)軟件包base中包含了一些基本的調(diào)試工具,當(dāng)然CRAN中也有一些其它優(yōu)秀的調(diào)試工具。

    對(duì)于一般用戶來說,掌握base中的基本調(diào)試工具就能滿足大部分需求,下面介紹R基本軟件包base中的調(diào)試工具的使用方法(也包含setBreakpoint(),其位于utils包中)。   

   由于在啟動(dòng)和關(guān)閉調(diào)試中需要用到部分調(diào)試命令,這里就先介紹進(jìn)入調(diào)試模式后需要用到的一些基本命令。


    1.基本調(diào)試命令

    在進(jìn)入dedbug調(diào)試狀態(tài)后,命令提示符從>變?yōu)?/span>Browse[d]>(d表示函數(shù)調(diào)用鏈的深度),可以通過一些基本的命令來進(jìn)行控制:

  • n(表示next): 告訴R執(zhí)行下一行代碼,并且執(zhí)行完后馬上暫停,實(shí)際就是一行一行地執(zhí)行代碼。相當(dāng)于C語言開發(fā)工具Turbo C中的trace into。
  • c(表示continue):表示會(huì)執(zhí)行若干條語句。若當(dāng)前處在循環(huán)中,這一步會(huì)執(zhí)行完整個(gè)循環(huán),若當(dāng)前處在函數(shù)內(nèi)但又不再循環(huán)中,則會(huì)執(zhí)行完當(dāng)前函數(shù)。相當(dāng)于C語言開發(fā)工具Turbo C中的step over。
  • where: 輸出一份棧跟蹤路徑,顯示到達(dá)當(dāng)前位置的過程中函數(shù)的調(diào)用序列。
  • Q: 退出brower,返回R的主交互模式。
  • 任意R命令: 即使在調(diào)試狀態(tài)browser中,依然處于R的交互模式中,所以你可以用任意R命令。



    2啟動(dòng)和關(guān)閉調(diào)試

    R的核心調(diào)試工具由browser構(gòu)成,通過browser,你可以逐行運(yùn)行代碼,并在運(yùn)行過程中進(jìn)行檢查,查看變量。在調(diào)試代碼時(shí),我們首先要讓程序進(jìn)入調(diào)試狀態(tài),有下列幾種方式可以實(shí)現(xiàn)。


    2.1 在代碼中的指定位置加入browser()

   開啟調(diào)試:

      在R源文件中的指定位置插入函數(shù)browser(),保存源文件,運(yùn)行源程序,程序一旦運(yùn)行到browser()處,將會(huì)自動(dòng)進(jìn)入debug狀態(tài)。

   取消調(diào)試:

      但當(dāng)用戶完成調(diào)試后,需要手動(dòng)刪除源文件中的browser()函數(shù),否則每次運(yùn)行到browser()位置都會(huì)進(jìn)入debug狀態(tài)。

       temp_test.R:

           (PS:此文件在下面會(huì)多次用到,所以貼出來,但后續(xù)用到時(shí)已經(jīng)刪除了browser()) 

  1. countsum <- function(count)  
  2. {  
  3.     sum <- 0  
  4.     for (i in 1:count)  
  5.     {  
  6.         sum <- sum + i  
  7.     }  
  8.     browser()  
  9.     return (sum)  
  10. }  
  11. results <- countsum(100)  
  12. print(results)  
  13.    
    運(yùn)行之后:

  1. > source("temp_test.R")  
  2. Called from: countsum(100)  
  3. Browse[1]>  


    2.2調(diào)用debug()

    R的調(diào)試工具是針對(duì)單個(gè)函數(shù)的,由于擁有函數(shù)式編程的特性,R的每一個(gè)運(yùn)算符,實(shí)際上也是函數(shù)(關(guān)于R函數(shù),可參考這里),這里所說的函數(shù)不包括一般的運(yùn)算符。

   開啟調(diào)試:

      執(zhí)行命令debug(fun)

            fun指函數(shù)名,這樣每次調(diào)用函數(shù)fun()都會(huì)進(jìn)入調(diào)試狀態(tài)。

    取消調(diào)試:

       執(zhí)行命令undebug(fun)

       再次調(diào)用函數(shù)fun()將不會(huì)進(jìn)入調(diào)試狀態(tài)。

   如下例所示: 

  1. > source("temp_test.R")  
  2. [1] 5050  
  3. > debug(countsum)  
  4. > countsum(10)  
  5. debugging in: countsum(10)  
  6. debug at temp_test.R#1: {  
  7.     sum <- 0  
  8.     for (i in 1:count) {  
  9.         sum <- sum + i  
  10.     }  
  11.     return(sum)  
  12. }  
  13. Browse[2]> n  
  14. debug at temp_test.R#2: sum <- 0  
  15. Browse[2]> n  
  16. debug at temp_test.R#3: for (i in 1:count) {  
  17.     sum <- sum + i  
  18. }  
  19. Browse[2]> sum  
  20. [1] 0  
  21. Browse[2]> c  
  22. exiting from: countsum(10)  
  23. [1] 55  
 

    2.3調(diào)用debugonce()

     debug()的調(diào)用方式一樣,區(qū)別在于:debugonce()只會(huì)在設(shè)置之后的第一次調(diào)用時(shí)進(jìn)入調(diào)試狀態(tài)且只只進(jìn)入一次,而debug()可以進(jìn)入無限多次直到通過undebug()取消調(diào)試。


    2.4用函數(shù)trace()進(jìn)行跟蹤

    trace(fun,tracer)

    fun表示需要跟蹤或者取消跟蹤的函數(shù)名;racer表示跟蹤的對(duì)象,可以是某個(gè)函數(shù),也可以是函數(shù)中的某個(gè)表達(dá)式。

    開啟調(diào)試:

      執(zhí)行命令trace(fun,tracer)

      每次調(diào)用函數(shù)fun(),都會(huì)顯示表達(dá)式的值,或者對(duì)函數(shù)進(jìn)行某些操作。

    取消調(diào)試:

      執(zhí)行命令untrace(fun)

      取消對(duì)某個(gè)函數(shù)的跟蹤。

   如下例所示:

  1. > source("temp_test.R")  
  2. [1] 5050  
  3. > trace(countsum,sum)  
  4. [1] "countsum"  
  5. > countsum(10)  
  6. Tracing countsum(10) on entry  
  7. [1] 55  
  8. > untrace(countsum)  
  9. > trace(countsum,browser())  
  10. Called from:methods::.TraceWithMethods(countsum, browser(), where =<environment>)  
  11. Browse[1]> Q  
  12. > rm(list = ls())  
  13. > source("temp_test.R")  
  14. [1] 5050  
  15. > trace(countsum,sum)  
  16. [1] "countsum"  
  17. > countsum(10)  
  18. Tracing countsum(10) on entry  
  19. [1] 55  
  20. > untrace(countsum)  
  21. > trace(countsum,browser)  
  22. [1] "countsum"  
  23. > countsum(20)  
  24. Tracing countsum(20) on entry  
  25. Called from: eval(expr, envir, enclos)  
  26. Browse[1]> n  
  27. debug: {  
  28. sum <- 0  
  29. for (i in 1:count) {  
  30. sum <- sum + i  
  31. }  
  32. return(sum)  
  33. }  
  34. Browse[2]> c  
  35. [1] 210  


    2.5.設(shè)置斷點(diǎn)setBreakpoint()

    setBreakpoint()位于utils包中,R版本需要>=2.10

    setBreakpoint(filename,linenumber)

  表示會(huì)在源文件filename的第linenumber行設(shè)置斷點(diǎn),但是實(shí)際上是通過函數(shù)來進(jìn)行設(shè)置的,這點(diǎn)需要注意,即只有所設(shè)置的斷點(diǎn)處于文件中的某個(gè)函數(shù)內(nèi)才是有效的。此函數(shù)可以用在debug調(diào)試狀態(tài)中,在單步調(diào)試過程中,當(dāng)設(shè)置了斷點(diǎn)后,可以讓程序直接運(yùn)行到到斷點(diǎn)處,這在調(diào)試過程中很有用處。

    開啟調(diào)試:

      執(zhí)行命令setBreakpoint(filename,linenumber)

      然后再執(zhí)行代碼,當(dāng)代碼運(yùn)行到斷點(diǎn)處即進(jìn)入調(diào)試狀態(tài)。

    取消調(diào)試:

      執(zhí)行命令untrace(fun)

          fun表示函數(shù)名Breakpoint要設(shè)在函數(shù)內(nèi)才有效,所以應(yīng)當(dāng)通過函數(shù)來取消斷點(diǎn)setBreakpoint()是通過調(diào)用trace()發(fā)揮作用的。

   如下例所示:

  1. >source("temp_test.R")  
  2. [1]5050  
  3. >setBreakpoint("temp_test.R",3)  
  4. /home/sheng/WinD/test/temp_test.R#3:  
  5. countsumstep 3 in <environment: R_GlobalEnv>  
  6. >countsum(20)  
  7. temp_test.R#3  
  8. Calledfrom: countsum(20)  
  9. Browse[1]>n  
  10. debug:for (i in 1:count) {  
  11.     sum<- sum + i  
  12. }  
  13. Browse[2]>where  
  14. where1: countsum(20)  
  15. Browse[2]>sum  
  16. [1]0  
  17. Browse[2]>c  
  18. [1]210  



參考:

[1] Norman Matloff著,陳堰平等譯.R語言編程藝術(shù).機(jī)械工業(yè)出版社,2013-05






    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多