2016-04-28 61 views
19

在爲browser幫助文件中,有兩個似乎非常類似的選項:瀏覽器中完成和繼續有什麼區別?

f

電流環路的執行完成或功能

c

退出瀏覽器並繼續執行下一條語句。

他們之間有什麼區別,在什麼情況下差異明顯?

什麼可能是差一些線索 - 我寫了一個與以下內容稱爲browse.R腳本:

for (i in 1:2){ 
    browser() 
    print(i) 
} 

這是使用c VS f結果:

> source("browse.R") 
Called from: eval(expr, envir, enclos) 
Browse[1]> c 
[1] 1 
Called from: eval(expr, envir, enclos) 
Browse[1]> c 
[1] 2 
> source("browse.R") 
Called from: eval(expr, envir, enclos) 
Browse[1]> f 
[1] 1 
Browse[2]> f 
[1] 2 

注意Browse[n]的等級發生變化。這仍然沒有強調它們之間的任何實際區別。

我也想看看是否也許事情會從瀏覽器環境消失:

for (i in 1:2){ 
    a <- "not modified" 
    browser() 
    print(a) 
} 

Called from: top level 
Browse[1]> a <- "modified" 
Browse[1]> f 
[1] "modified" 
Browse[1]> a 
[1] "not modified" 
Browse[1]> a <- "modified" 
Browse[1]> c 
[1] "modified" 

所以沒有區別有兩種。

+0

的C內部和'這裏F'大約一半, :https://github.com/wch/r-source/blob/e5b21d0397c607883ff25cca379687b86933d730/src/main/main.c [Ctrl + F爲'ParseBrowser(SEXP CExpr,SEXP rho)'],但我的c不夠強了解代碼執行的不同當然 – Chris

+0

它可能是一個錯誤?預期的'f'行爲是你完成當前函數,然後返回到瀏覽器(不退出)。當您查看源代碼時,也會出現這種差異(請參閱上面的註釋)。當輸入'c'時,結果是'SET_RDEBUG(rho,0);'其中rho是指向調用瀏覽器的函數的指針。然而,當你看看'f'部分時,它將調試狀態設置爲true:'SET_RDEBUG(rho,1);'但是隻有在退出函數(指針消失)之後,它應該將rho的調試狀態設置爲高一級在堆棧軌跡上。只是一個想法,不知道是否正確。 – takje

+0

@takje在這種情況下,瀏覽器不會更高,會嗎?它會爆發並重新開始。 –

回答

0

您可以將finish作爲break以其他語言。會發生什麼情況是因爲某些條件,例如找到可能導致錯誤的特定項目或項目,您不再在意迭代中的其他項目。另一方面,在另一方面,將停止在循環的當前行,忽略代碼塊的其餘部分,並且繼續到迭代中的下一個項目。如果您打算遍歷迭代中的每個項目,並且忽略滿足條件跳過的項目,則可以使用此選項。

+1

這就是描述聽起來像,但它似乎並沒有這樣執行。你有沒有一個例子,其中的兩個行爲不同? – Chris

+0

也許你可以給我一段代碼,我會解釋結果 –

+0

考慮'for(i in 1:2){browser(); print(i)}'。 'c'和'f'都會導致兩者都被打印。 –

9

有一個小的差異。

  • c立即退出瀏覽器(和調試模式),然後以正常方式執行其餘代碼。
  • f在執行函數/循環的其餘部分時停留在瀏覽器(和調試模式)中。在函數/循環完成後,他也返回到正常執行模式。

來源:R-source(行1105至1117年)和R-help

這有幾個含義:

  • c關閉瀏覽器。這意味着從一個函數調用新的瀏覽器調用。因此您會看到該行:Called from: function()。另一方面,f不會關閉瀏覽器,因此您不會看到這一行。此行爲的源代碼位於:https://github.com/wch/r-source/...
  • 由於f停留在瀏覽器中,f還跟蹤contextlevel的:

瀏覽器提示的形式瀏覽的[N]>:其中var {N}表示 '瀏覽器級別' 。瀏覽器可以在瀏覽時調用(並且通常在調試正在使用時),並且每次遞歸調用都會增加該數量。 (實際數量是上下文堆棧上「上下文」的數量:這通常是2用於瀏覽的外水平和1檢查在調試器轉儲時)

這些差異可以用代碼進行測試:

> test <- function(){ 
     browser() 
     browser() 
    } 

> test() 
Called from: test() 
Browse[1]> c 
Called from: test() 
Browse[1]> c 

> test() 
Called from: test() 
Browse[1]> f 
Browse[2]> f 

就我所見,兩者之間沒有實際的區別,除非在上下文堆棧中存在實際的目的。調試模式沒有附加值。當你輸入函數時,調試標誌只會打開瀏覽器,但由於你已經在函數中,它不會觸發另一個效果。

+0

可惜他們之間沒有區別,但我想事情就是這樣。 –

3

瀏覽器,並

至少對我來說,我覺得答案可以作爲表映射出來,但是,讓我們先架起瀏覽器(的使用),之間的差異對於那些誰可能還沒有遇到它。

browser函數是大多數R調試技術的基礎。本質上,調用browser暫停執行,並啓動一個特殊的交互式會話,您可以在其中檢查計算的當前狀態,並逐步執行代碼1命令。

一旦進入瀏覽器,您可以執行任何R命令。例如,可以使用ls()來查看本地環境。或者選擇設置新變量,或者只需使用標準方法將值分配給變量即可更改分配給變量的值。瀏覽器還能理解一小組指令 。這使我們的討論上完成繼續 ...

在關係微妙到完成繼續是:

  • 完成,或˚F :完成當前循環或函數的執行。
  • 繼續,c:留下交互式調試並繼續執行該功能的常規 。如果您修復了錯誤的 狀態並想檢查該功能是否正確繼續,那麼這很有用。

從本質上講,我們談論模式中的微妙之處。

enter image description here

瀏覽器/恢復概述

至少對我來說,你在調試用R.程序的情況下查看該具體如何可能會把完成繼續。我相信很多人都明白這一點,但我包括了完整性,因爲我個人真的很久沒有。

  • browser讓你看看哪個瀏覽器調用被放置在該函數的對象。
  • recover允許您查看這些對象以及該函數的調用者和所有其他活動函數中的對象。

自由使用browserrecovercat而你正在編寫功能print讓你的期望和R的期望收斂。

這樣做的一個非常方便的方法是跟蹤。例如,如果在 瀏覽myFun功能到底是方便,那麼你可以做:

trace(myFun, exit=quote(browser()))

您可以自定義跟蹤用以下命令:

trace(myFun, edit=TRUE)

如果遇到錯誤,則調試是適當的行動。有至少兩種調試方法在 。第一種方法是看看發生錯誤的點的狀態 。通過設置錯誤 選項爲此做好準備。這兩個最有可能的選擇是:

options(error=recover)

options(error=dump.frames)

不同的是,與recover則會自動扔到調試 模式,但與dump.frames你餡餅調試通過執行:

debugger()

在任一情況下,你都帶有一個選擇畫面(環境)的 的活性功能檢查。

您可以強制R鍵警告視爲與指揮失誤:

options(warn=2)

如果你想在錯誤選項在.First功能設置,那麼你需要一個 伎倆,因爲當執行.First時,並非一切都已到位:

options(error=expression(recover()))

options(error=expression(dump.frames()))

用於調試第二個想法是到步驟通過函數在執行時。如果 要步功能myfun,然後執行:

debug(myfun)

,然後執行涉及myfun的聲明。當您完成調試, 做:

undebug(myfun)

一個更復雜的版本,這種調試可在 調試包中找到。

參考文獻:

+0

這是一個非常好的調試總覽,但我不認爲它回答我的具體問題 –

+0

@ sebastian-c - 感謝您的反饋。我更新了答案(希望)解決您的具體問題。我不得不承認,我更喜歡takje的回答(upvoted)。我想離開,但我認爲它可能有助於提供更完整的使用和繼續的背景。希望有用。保重。 – Technophobe01

+0

你的編輯更加具體,並且仍然是一個很好的調試概述,並且確實討論了c和f,但不幸的是並沒有描述差別明顯的情況。 –

相關問題