作为函数式编程语言,R是否具有模式匹配?(如Scala或F#)

use*_*285 1 f# functional-programming scala r pattern-matching

我听说R是一种功能编程语言,因此我决定尝试将其用于统计计算。我熟悉Scala和F#中的函数式编程范例,在每种语言中,都有一个名为“模式匹配”的简洁功能,您可以在其中执行以下操作:

object Matcher extends App {

  class A
  class B extends A
  class C extends A

  class D(one: A, two: A) {

    def work {
      (one, two) match {
        case (o: B, t: B) => println("B")
        case (o: B, t: C) => println("C")
        case _ =>
      }
    }
  }

  val d1 = new D(new B, new B)
  val d2 = new D(new B, new C)

  d1.work
  //B
  d2.work
  //C
}
Run Code Online (Sandbox Code Playgroud)

我想知道R是否具有这样的功能。Scala和F#中的模式匹配会变得更加复杂,并进行类型检查,元组检查,条件检查等等。但是,每当我搜索“ R中的模式匹配”时,我得到的都是正则表达式类型的结果。R是一种功能语言,没有此功能,还是我只是不知道它的名字?

Pat*_*rry 5

您可以使用该switch函数获得某些行为。但是,R不具有您在Scala和F#中惯用的求和类型。

R是一种动态语言,非常类似于scheme和lisp,但是语法不同。如果您来自强类型语言(例如F#或Scala),则必须进行一些调整。您失去了强类型的好处,但获得了动态类型的好处。

事实证明,对于数据分析,动态类型通常更适合。

  • 点了。但是,您在R中所做的大部分工作都是矢量化的,并且模式匹配在这些情况下效果不佳。您可能还需要看一下“ tapply”函数:将值的向量拆分为由分类变量(因子)定义的子集,然后将函数应用于每个子集。您可能也对`dplyr`或`purrr`软件包感兴趣。 (3认同)
  • Common Lisp是动态键入的-但是有几种不同的模式匹配实现可用。因此,模式匹配并不是严格意义上的类型划分与非类型划分(在强类型语言中,它可以促进许多类型错误,否则这些错误可能在运行时才被发现)。无论如何,这里有一个更高级的R开关用法的示例和/或文档吗? (2认同)