0
点赞
收藏
分享

微信扫一扫

使用 if 语句

与很多编程语言一样,if 表达式用来处理逻辑条件。在 R 中,逻辑条件通常表达为某

个表达式返回的单值逻辑向量。例如,我们可以写一个简单的函数 check_positive,

如果输入一个正数则返回 1,否则不返回任何值:

check_positive <- function(x) {

if (x > 0) {

return(1)

}

}

上述函数中,x>0 就是需要检查的条件。如果满足这个条件,则函数返回 1。我们用

不同的输入值来验证一下:

check_ _positive(1)

## [1] 1

check_ _positive(0)

可以看出,函数的运行结果正如我们所期待的那样。如果加入一些 else if 和 else 分

支语句,这个函数就可以泛化为符号函数,即输入正数返回 1,输入负数返回−1,输入 0

返回 0:

check_sign <- function(x) {

if (x > 0) {

return(1)

} else if (x < 0) {

return(-1)

} else {

return(0)

}

}

上述函数具有与内置函数 sign( ) 相同的功能。为了验证它的逻辑,我们只需在调

用函数时,提供不同的输入值,分别满足函数的各个分支条件:

check_ _sign(15)

## [1] 1

check_ _sign(-3.5)

## [1] -1

check_ _sign(0)

## [1] 0

若要求函数不返回任何值,那么,我们可以根据相应条件控制函数不输出结果(更

确的说是返回 NULL)。下面的函数就不会明确返回一个值,而是向控制台发送一条消息。

消息的种类取决于输入值的符号:

say_sign <- function(x) {

if (x > 0) {

cat("The number is greater than 0")

} else if (x < 0) {

cat("The number is less than 0")

} else {

cat("The number is 0")

}

}

我们可以用类似的方法测试 say_sign( ) 函数的逻辑:

say_ _sign(0)

## The number is 0

say_ _sign(3)

## The number is greater than 0

say_ _sign(-9)

## The number is less than 0

if 分支语句的工作流是非常直观的:

1.首先,检查第 1 条语句 if (cond1) {expr1} 的条件 cond1;

2.若 cond1 为 TRUE,则执行其对应表达式{expr1};

否则,转向下一个分支语句 else if (cond2),并检查条件 cond2;依此类推;

3.如果违背了所有 if 和 else if 分支条件,则执行 else 分支表达式(如果有的话)。

由此推断,if 语句或许比你想象的更加灵活。例如,if 可以用在如下形式中。

最简单的形式就是一个简单的 if 语句分支:

if (cond1) {

# do something

}

一种稍复杂些的形式是用一个 else 分支来处理 cond1 的返回值不是 TRUE 的情况:

if (cond1) {

# do something

} else {

# do something else

}

一种更复杂的形式就是有一个或多个 else if 分支:

if (cond1) {

expr1

} else if (cond2) {

expr2

} else if (cond3) {

expr3

} else {

expr4

}

在上述条件分支中,分支条件(cond1、cond2 和 cond3)可能是相关的或不相关的。

例如,简单的成绩分级体系完全符合上述模板中的这种分支逻辑,每一个分支条件都是对

分数的一次切片操作:

grade <- function(score) {

if (score >= 90) {

return("A")

} else if (score >= 80) {

return("B")

} else if (score >= 70) {

return("C")

} else if (score >= 60) {

return("D")

} else {

return("F")

}

}

c(grade(65), grade(59), grade(87), grade(96))

## [1] "D" "F" "B" "A"

在这种情况下,每执行一个 else if 分支条件,实际上都隐含了假设该分支前面的条件

不成立。也就是说 score >=80 实际上是指score < 90 并且 score >= 80,它依赖于前

面的条件。因此,除非明确说明所有分支都相互独立,否则我们不能改变这些分支语句的顺序。

假设改变一些分支语句的顺序:

grade2 <- function(score) {

if (score >= 60) {

return("D")

} else if (score >= 70) {

return("C")

} else if (score >= 80) {

return("B")

} else if (score >= 90) {

return("A")

} else {

return("F")

}

}

c(grade2(65), grade2(59), grade2(87), grade2(96))

## [1] "D" "F" "D" "D"

显然,只有 grade(59) 得到了正确的分组,其他都是错误的。如果想在不重新排序

的情况下调用这个函数,我们需要重写判断条件以使其不依赖于检查顺序:

grade2 <- function(score) {

if (score >= 60 && score < 70) {

return("D")

} else if (score >= 70 && score < 80) {

return("C")

} else if (score >= 80 && score < 90) {

return("B")

} else if (score >= 90) {

return("A")

} else {

return("F")

}

}

c(grade2(65), grade2(59), grade2(87), grade2(96))

## [1] "D" "F" "B" "A"

这使得函数比正确形式繁琐许多。因此,找出分支条件的正确顺序,并注意各个分支

之间的依赖性是十分重要的。

好在 R 提供了一些函数,如 cut( ),可以很方便地达到同样的效果。输入 ?cut 来

阅读帮助文档以获取更多详细信息。




举报

相关推荐

0 条评论