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!
正如你在输出中看到的,信息已经显示在控制台。
示例
我们也可以手动定义verbosity,使其成为一个特定的软件或程序的丰富功能,如–
# 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为我们提供了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
正如你在输出中看到的那样,由于数字1小于数字2,因此错误信息显示在控制台。
语法
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中的各种防御性编程技术。我希望这能帮助你加强你在数据科学领域的知识。