R:如何制作切换声明

R: How to make a switch statement fallthrough

在许多语言中,有一个名为break的指令,它告诉解释器在当前语句之后退出开关。如果忽略了它,则在处理当前案例后,开关将断开:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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而导致错误,但默认情况下,有几种语言正在中断,并包含fallthrough关键字(例如,Perl中的continue)。

根据设计,R开关在每种情况结束时也默认断开:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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()中是不可能的。正如评论中所建议的,最好的选择是实现我自己的版本。

因此,我对我的optional包进行了更新,以实现这个特性(cran)。

通过这个更新,您现在可以在模式匹配函数match_with中使用fallthrough语句。

问题中的设计模式可以通过以下方式复制:

1
2
3
4
5
6
7
8
9
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()非常相似,但它具有扩展功能。例如,模式可以是列表或功能序列,而不是简单的比较对象:

1
2
3
4
5
6
7
8
9
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"