R:如何使 switch 语句失效
R: How to make a switch statement fallthrough
在很多语言中,有一条指令叫做break
,它告诉解释器在当前语句之后退出switch。如果省略,当前case处理完后switchfall-through:
switch (current_step)
{
case 1:
print("Processing the first step...");
# [...]
case 2:
print("Processing the second step...");
# [...]
case 3:
print("Processing the third step...");
# [...]
break;
case 4:
print("All steps have already been processed!");
break;
}
如果你想经历一系列传递条件,这样的设计模式会很有用。
我知道如果程序员忘记插入 break 语句,这可能会导致错误,因为无意中失败,但是默认情况下有几种语言会中断,并包含 fallthrough 关键字(例如 continue
在 Perl 中)。
根据设计,R 开关也会在每个案例结束时默认中断:
switch(current_step,
{
print("Processing the first step...")
},
{
print("Processing the second step...")
},
{
print("Processing the third step...")
},
{
print("All steps have already been processed!")
}
)
上面代码中,如果current_step
设置为1,输出只会是"Processing the first step..."
。
R 中是否有任何方法可以强制 switch case 落入以下 case?
switch()
似乎无法实现这种行为。
正如评论中所建议的,最好的选择是实现我自己的版本。
因此,我更新了我的 optional
包以实现此功能 (CRAN)。
通过这次更新,您现在可以在模式匹配函数中使用 fallthrough 语句 match_with
。
问题中的设计模式可以通过以下方式重现:
library(optional)
a <- 1
match_with(a
1, fallthrough(function() "Processing the first step..."),
2, fallthrough(function() "Processing the second step..."),
3, function() "Processing the third step...",
4, function() "All steps have already been processed!"
)
## [1] "Processing the first step..." "Processing the second step..." "Processing the third step..."
您可以观察到 match_with()
与 switch()
非常相似,但它具有扩展功能。例如。模式可以是列表或函数序列,而不是要比较的简单对象:
library("magrittr")
b <- 4
match_with(a,
. %>% if (. %% 2 == 0).,
fallthrough( function() "This number is even" ),
. %>% if ( sqrt(.) == round(sqrt(.)) ).,
function() "This number is a perfect square"
)
## [1] "This number is even" "This number is a perfect square"
在很多语言中,有一条指令叫做break
,它告诉解释器在当前语句之后退出switch。如果省略,当前case处理完后switchfall-through:
switch (current_step)
{
case 1:
print("Processing the first step...");
# [...]
case 2:
print("Processing the second step...");
# [...]
case 3:
print("Processing the third step...");
# [...]
break;
case 4:
print("All steps have already been processed!");
break;
}
如果你想经历一系列传递条件,这样的设计模式会很有用。
我知道如果程序员忘记插入 break 语句,这可能会导致错误,因为无意中失败,但是默认情况下有几种语言会中断,并包含 fallthrough 关键字(例如 continue
在 Perl 中)。
根据设计,R 开关也会在每个案例结束时默认中断:
switch(current_step,
{
print("Processing the first step...")
},
{
print("Processing the second step...")
},
{
print("Processing the third step...")
},
{
print("All steps have already been processed!")
}
)
上面代码中,如果current_step
设置为1,输出只会是"Processing the first step..."
。
R 中是否有任何方法可以强制 switch case 落入以下 case?
switch()
似乎无法实现这种行为。
正如评论中所建议的,最好的选择是实现我自己的版本。
因此,我更新了我的 optional
包以实现此功能 (CRAN)。
通过这次更新,您现在可以在模式匹配函数中使用 fallthrough 语句 match_with
。
问题中的设计模式可以通过以下方式重现:
library(optional)
a <- 1
match_with(a
1, fallthrough(function() "Processing the first step..."),
2, fallthrough(function() "Processing the second step..."),
3, function() "Processing the third step...",
4, function() "All steps have already been processed!"
)
## [1] "Processing the first step..." "Processing the second step..." "Processing the third step..."
您可以观察到 match_with()
与 switch()
非常相似,但它具有扩展功能。例如。模式可以是列表或函数序列,而不是要比较的简单对象:
library("magrittr")
b <- 4
match_with(a,
. %>% if (. %% 2 == 0).,
fallthrough( function() "This number is even" ),
. %>% if ( sqrt(.) == round(sqrt(.)) ).,
function() "This number is a perfect square"
)
## [1] "This number is even" "This number is a perfect square"