防禦式 R 程式設計


防禦式程式設計是一種軟體開發實踐,它涉及以一種預期和防止錯誤和漏洞的方式設計和實現程式碼。在 R 程式設計中,防禦式程式設計涉及使用技術和策略來確保您的 R 程式碼健壯、可靠和安全。

對於防禦式程式設計中的“防禦式”一詞,你們中的大多數人可能對它是否意味著編寫永遠不會失敗的程式碼感到困惑。但“防禦式程式設計”的實際定義是編寫能夠正確失敗的程式碼。透過“正確失敗”,我們的意思是 -

  • 如果程式碼失敗,那麼如果有一些操作並且處理這些操作非常昂貴,它應該能夠立即失敗。

  • 如果程式碼失敗,那麼它應該能夠釋放所有資源並且不寫入任何檔案等。

  • 如果程式碼失敗,那麼它應該顯示帶有適當描述的錯誤訊息。

  • 如果程式碼失敗,則應妥善處理。作為開發人員,您需要除錯它或獲得更多關於它的見解。

防禦式 R 程式設計技術

我們現在將討論屬於防禦式 R 程式設計的各種技術 -

診斷訊息

語法

R 允許我們使用 message() 函式在控制檯上顯示診斷訊息。此函式具有以下語法,

message(diagonostic_message)

這裡 diagnostic_message 是您要顯示的訊息。

示例

現在讓我們考慮下面給出的程式 -

# Defining myFunction()
myFunction <- function() {
   
   # Diagnostic message
   message("You need to run system updates!")
       
   # Doing some work
   number1 = 10
   number2 = 20
   sum = number1 + number2
}

# Calling function
myFunction()

輸出

You need to run system updates!

如您在輸出中看到的,訊息已顯示在控制檯上。

示例

我們還可以手動定義詳細程度以使其成為特定軟體或程式功能豐富,如下所示 -

# Defining myFunction()
myFunction <- function(verbose) {
   
   # Diagnostic message
   if(verbose)
   message("You need to run system updates!")
       
   # Doing some work
   number1 = 10
   number2 = 20
   sum = number1 + number2
}

# Calling function
myFunction(verbose = TRUE)

輸出

You need to run system updates!

如您在輸出中看到的,訊息已顯示在控制檯上。

語法

需要注意的是,有時我們需要抑制程式中的煩人訊息。為此,R 在 R 中為我們提供了 suppressMessages() 函式。此函式具有以下語法 -

suppressMessages(func())

示例

這裡 func() 是宣告訊息的函式。

# Defining myFunction()
myFunction <- function() {
   
   # Diagnostic message
   message("You need to run system updates!")
       
   # Doing some work
   number1 = 10
   number2 = 20
   sum = number1 + number2
       
   # Display the sum
   print(sum)
}

# Suppress message
suppressMessages(myFunction())

輸出

[1] 30

如您在輸出中看到的,訊息已顯示在控制檯上。

警告訊息

語法

程式中的警告訊息用於突出顯示潛在問題。R 為我們提供了 warning() 函式,我們可以使用它在控制檯上顯示警告訊息以實現更好的防禦式程式設計。此函式具有以下語法,

warning(warning_message)

這裡 warning_message 是要顯示的訊息。

示例

現在讓我們考慮以下程式 -

# Defining myFunction()
myFunction <- function() {
   
   # Diagnostic message
   warning("Something wrong might happen in you code!")
       
   # Doing some work
   number1 = 10
   number2 = 20
   sum = number1 + number2
}

# Calling function
myFunction()

輸出

Warning message:
In myFunction() : Something wrong might happen in you code!

如您在輸出中看到的,警告訊息已顯示在控制檯上。

錯誤訊息

語法

當我們的程式碼失敗並且發生錯誤時,在這種情況下,我們應該將錯誤訊息列印到控制檯。為此,R 為我們提供了 error() 函式。此函式具有以下語法,

error(error_message)

這裡 error_message 是要顯示的錯誤訊息。

示例

現在考慮以下演示 stop() 函式工作原理的程式 -

# Defining myFunction()
myFunction <- function() {
   
   # Diagnostic message
   stop("Something wrong has happened in your code!")
       
   # Doing some work
   number1 = 10
   number2 = 20
   sum = number1 + number2
}

# Calling function
myFunction()

輸出

Error in myFunction() : Something wrong has happened in your code!

如您在輸出中看到的,錯誤訊息已顯示在控制檯上。

使用 stopifnot() 檢查條件

示例

我們之前在這篇文章中討論過,我們可以使用 stop() 函式在 R 中建立錯誤。現在讓我們考慮以下程式,該程式檢查向量是否儲存字元型別的值。

# Creating a vector
   myVector <- 100
     
   # Check whether the vector hold character value
   # If not print error to console
   # using stop() function
   if (!is.character(myVector)) {
      stop("Error found! myVector must be a character vector.")
   }

輸出

Error: Error found! myVector must be a character vector.

如您在輸出中看到的,錯誤訊息已顯示在控制檯上。

上述程式的缺點是,如果我們要評估多個條件,則可能需要多行程式碼來檢查所有條件,從而不必要地增加程式的程式碼量。

語法

R 為我們提供了 stopifnot() 函式,我們可以使用它來處理多個條件。此函式具有以下語法,

stopifnot(condition)

此函式接受條件作為引數並返回布林值和相應的錯誤訊息(如果傳遞的條件中存在某些錯誤)。

示例

讓我們考慮一個演示此函式工作原理的示例 -

# Creating a vector
myVector <- 100

# Check whether vector hold character value
# If not print error to console
# using stop() function
stopifnot(is.character(myVector))

輸出

Error: is.character(myVector) is not TRUE

如您在輸出中看到的,由於 myVector 包含整數值,因此控制檯顯示錯誤訊息。

編寫測試

在 R 中,我們有 assertthat 包,可用於測試。如果您尚未安裝此包,則可以在 R 中使用以下命令並使用 CRAN 安裝該包 -

install.packages("assertthat")

語法

assertthat 包為我們提供了 assert_that() 函式,我們可以使用它來測試任何邏輯語句。此函式具有以下語法 -

assert_that(condition)

它接受邏輯條件作為引數

示例

考慮以下演示此函式工作原理的程式 -

# Importing library
library(assertthat)

# Defining two integer variables
number1 = 100
number2 = 150

# Make sure that number1 is greater than number2
assert_that(number1 > number2)

輸出

Error: number1 not greater than number2

如您在輸出中看到的,由於 number1 小於 number2,因此控制檯顯示錯誤訊息。

語法

assert_that() 函式也可以應用於比較兩個向量的值,但其語法與上述語法略有不同 -

assert_that(all(condition))

它接受邏輯條件作為引數。

示例

考慮以下使用此函式比較兩個向量值的程式 -

# Importing library
library(assertthat)

# Defining two vectors of integer type
vector1 <- c(10, 20, 30, 40)
vector2 <- c(50, 60, 70, 80)

# Make sure that all the elements 
# of vector1 are lesser than the
# corresponding elements of vector2
assert_that(all(vector1 < vector2))

輸出

[1] TRUE

結論

在本教程中,我們討論了 R 中的各種防禦式程式設計技術。我希望這有助於您加強在資料科學領域的知識。

更新於: 2023年1月17日

337 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.