《R语言初学指南》一2.3 找到R脚本中的错误
本節書摘來自異步社區《R語言初學指南》一書中的第2章,第2.3節,作者【美】Brian Dennis(布萊恩·丹尼斯),更多章節內容可以訪問云棲社區“異步社區”公眾號查看
2.3 找到R腳本中的錯誤
R語言初學指南
復雜項目中的R腳本會非常長。即使是R專家,也很少能一次性將其編寫正確。腳本中的所有錯誤都是通過調試來修改的。
在腳本中稱追蹤錯誤或“bug”為“調試”。調試包括一些適用性檢測工作。
下面在腳本中故意制造一個bug,由此來練習如何調試。首先來做一些清理工作。使控制臺成為活動窗口,并輸入下列命令:
>objects()按照慣例,這里在展示控制臺中的命令時,依然在其前面顯示R提示符(“>”),但要記住,在控制臺中不需要輸入該提示符。不要忘記命令末尾的括號。在運行該命令后,就可在工作區內看到一串已用R命令建立好的“對象”:
[1] "a" "b" "k" "kill.rate" [5] "m" "moose.density"這些對象已存儲在R中,可供日后調用。現在輸入下列命令:
>rm(a,b,k,kill.rate,m,moose.density) >a哎?找不到對象a了,其他幾個對象也找不到。命令rm()表示“移除”,它會刪除括號中的所有對象。由于用戶可能會忘記之前在R會話中建立的對象,而導致后面的計算出現錯誤,這時命令objects()和rm()就會非常有用。
現在開始通過制造bug來搞破壞!回到R編輯器中,將腳本的第一個命令moose.density的首字母改為大寫字母M,然后重新運行腳本。這時會彈出圖形窗口,但其中沒有圖形顯示——出現錯誤了。看一下控制臺,找到與下列語句相似的內容(在不同版本的R中,出現的錯誤信息可能會稍有不同):
> Moose.density=c(.17,.23,.23,.26,.37,.42,.66,.80,1.11,1.30,1.37, + 1.41,1.73,2.49) > kill.rate=c(.37,.47,1.90,2.04,1.12,1.74,2.78,1.85,1.88,1.96, + 1.80,2.44,2.81,3.75) > plot(moose.density,kill.rate,type="p") Error in plot(moose.density, kill.rate, type = "p") :object 'moose.density' not found > m=2.5*(0:100)/100 > a=3.37 > b=0.47 > k=a*m/(b+m) > points(m,k,type="l") Error in plot.xy(xy.coords(x, y), type = type, ...) :plot.new has not been called yet控制臺中重現了腳本,其中還包含兩條錯誤信息。這里有兩點非常重要,需要注意。
首先,盡管沒有修改plot()語句和points()語句,但它們下面出現了錯誤信息,而實際上有錯誤(大寫字母M)的語句卻沒有任何提示。在腳本中,錯誤可以影響下面一系列命令出錯。這里,定義向量Moose.density的命令是一個在R中完全正確的語句,它在R的內存中建立了對象Moose.density以便日后調用,在控制臺中使用object()命令即可看到這一對象。問題出在繪圖語句上。plot()語句使用的向量moose.density并不存在,故plot()語句無法進行繪圖。接著由于沒有元素可以添加到圖形中,points()語句也就無法執行。
其次,在通常情況下,若可以定位并修正某個錯誤,則后面的一些錯誤也會被修正。因此,建議用戶在策略上,要從上到下一個一個地修改錯誤。此外,在每修改完一個語句或一小部分R腳本后,就對它們進行測試,以防修改本身包含錯誤并對后續的語句產生影響。不過,即使再小心謹慎,也幾乎沒有很長的R腳本可在第一次就能完美地運行出來。
若要在腳本中檢測并定位不明顯的錯誤,需要對腳本從頭開始進行一系列搜索及實驗。在空白的工作區中,可選中代碼并運行這部分腳本,從而很方便地完成這一任務。讀者可以試一下:首先像剛才一樣,在控制臺中刪除工作區內的所有對象,然后在R編輯器中選中第一個命令,使其高亮。在“Edit”的下拉菜單中(在微軟的Windows中,若對高亮區點擊右鍵,會彈出菜單),找到并點擊“Run line selection”選項,即可運行腳本中的第一行命令。在控制臺中檢查一下,這條命令建立了哪些對象。
若該命令的運行情況與預期一致,則繼續運行下一條語句。單獨選中并運行下一條語句,然后再連同腳本中前面的語句一起運行一遍。
當檢查到繪圖語句時,錯誤信息就會出現。繪圖命令在尋找一個不存在的對象。若在之前的檢查中沒有發現Moose.density與moose.density是兩個不同的對象,這時也許能清晰地發現這一點。R的用戶應當時刻注意變量名的大小寫以及拼寫錯誤問題,這是錯誤的一個主要來源。
找到并改正大寫的M,然后運行腳本,即可成功繪圖。但是等一下:過早地認為這是一個完美的腳本可能會導致失敗。有時即使腳本可以很好地運行,其運行結果也可能錯得離譜。當計算本身有概念性的錯誤時,這種情況就會發生。R會精確完成用戶的指令,且當用戶的指令有錯誤時,R也會按錯誤指令忠實地運行完成。
數據輸入是否正確?作者在輸入本章數據時,是否與第1章保持一致了呢?要想有效地使用R,仔細一點兒總不會錯。
總結
以上是生活随笔為你收集整理的《R语言初学指南》一2.3 找到R脚本中的错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ASM 翻译系列第二弹:ASM 12C
- 下一篇: 《深入理解Spark:核心思想与源码分析