防御式 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 中的各种防御式编程技术。我希望这有助于您加强在数据科学领域的知识。