亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

R中調試的一般建議

R中調試的一般建議

Smart貓小萌 2019-07-09 16:30:00
R中調試的一般建議我在使用我編寫的R函數時出錯:Warning messages:1: glm.fit: algorithm did not converge  2: glm.fit: algorithm did not converge我所做的:逐步完成功能添加打印以找出錯誤發生在哪一行,這意味著兩個不應該使用的函數glm.fit..他們是window()和save().我的一般方法包括添加print和stop命令,并逐行遍歷函數,直到找到異常為止。但是,我不清楚這些技術是從代碼中產生錯誤的。我甚至不確定代碼中的哪些函數依賴于glm.fit..我該如何診斷這個問題?
查看完整描述

3 回答

?
莫回無

TA貢獻1865條經驗 獲得超7個贊

我認為調試是一種藝術形式,所以沒有明確的銀彈。在任何語言中都有很好的調試策略,它們也適用于這里。讀這篇好文章)。例如,第一件事是重現問題.如果你不能這樣做,那么你需要獲得更多的信息(例如,通過日志記錄)。一旦你能復制它,你就需要減少一直到源頭。

與其說是“技巧”,不如說我有一個最喜歡的調試例程:

  1. 當發生錯誤時,我通常做的第一件事是通過調用

    traceback()

    :這顯示了錯誤發生的位置,如果您有幾個嵌套函數,這一點尤其有用。
  2. 接下來我會

    options(error=recover)

    這會立即切換到出現錯誤的瀏覽器模式,這樣您就可以從那里瀏覽工作區。
  3. 如果我仍然沒有足夠的信息,我通常使用

    debug()

    函數并逐行遍歷腳本。

R2.10中最好的新技巧(當處理腳本文件時)是使用findLineNum()setBreakpoint()職能。

作為最后的評論:根據錯誤,設置它也是非常有幫助的。try()tryCatch()關于外部函數調用的語句(特別是在處理S4類時)。這有時會提供更多的信息,而且還能讓您更好地控制在運行時如何處理錯誤。

這些相關問題有很多建議:


查看完整回答
反對 回復 2019-07-09
?
MYYA

TA貢獻1868條經驗 獲得超4個贊

正如我所指出的另一個問題Rprof()summaryRprof()是很好的工具查找程序的慢部分這可能從加速或遷移到C/C+實現中獲益。如果您正在進行模擬工作或其他計算機或數據密集型活動,這可能更適用。這個profr包裝可以幫助可視化結果。

我對調試有一點了解,所以另一個建議是另一個線程:

  • options(warn=2)

    將警告視為錯誤

您也可以使用options在發生錯誤或警告時,使用您所選擇的最喜歡的調試功能,將您直接放到操作的熱度中。例如:

  • options(error=recover)

    recover()

    當發生錯誤時,正如Shane所指出的(如

    r調試指南

    ..或者任何其他你認為有用的函數都可以運行。

另外兩種方法來自“Shane‘s”中的一種鏈接:

  • 將內部函數調用包裝為

    try()

    若要返回更多信息,請執行以下操作。
  • 對于*應用函數,使用

    .inform=TRUE

    (來自plyr包)作為Apply命令的選項

@JoShuaUlrich還指出運用經典的條件能力的巧妙方法browser()命令打開/關閉調試:

  • 放入您可能要調試的函數中。

    browser(expr=isTRUE(getOption("myDebug")))

  • 并將全局選項設置為

    options(myDebug=TRUE)

  • 您甚至可以包裝瀏覽器調用:

    myBrowse <- browser(expr=isTRUE(getOption("myDebug")))

    然后打電話給

    myBrowse()

    因為它使用了全局。

還有R2.10中的新功能:

  • findLineNum()

    獲取源文件名和行號,并返回函數和環境。當你

    source()

    一個.R文件,它在#n行返回一個錯誤,但是您需要知道#n行中的函數是什么。
  • setBreakpoint()

    獲取源文件名和行號,并在其中設置斷點。

這個碼器包,特別是其checkUsage函數在快速獲取編譯器通常會報告的語法和樣式錯誤(未使用的局部變量、未定義的全局函數和變量、部分參數匹配等)方面尤其有幫助。

setBreakpoint()是一個更方便用戶的前端trace()..有關如何工作的內部結構的詳細信息,可在最近R雜志的文章.

如果您正在嘗試調試其他人的包,一旦您找到了問題,您可以重寫它們的函數帶著fixInNamespaceassignInNamespace,但不要在生產代碼中使用此方法。

所有這些都不應排除嘗試過的真實。標準R調試工具,其中一些在上面,另一些則不在上面。特別是,驗尸調試工具當您有一堆您不希望重新運行的耗費時間的代碼時,非常方便。

最后,對于似乎不會拋出錯誤消息的棘手問題,可以使用options(error=dump.frames)如本問題所詳述:沒有引發錯誤的錯誤


查看完整回答
反對 回復 2019-07-09
  • 3 回答
  • 0 關注
  • 964 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號