R的编程范式是什么?

21

R语言(也称GNU S)的编程范式是什么?

我相信自己熟悉不同概念范式的编程语言(曾经使用过C++、Java、Prolog等语言编写程序),但尽管我已经编写了自己的小型R脚本,我仍然不确定R所代表的是哪个范式。


4
嘿,我感谢所有的回答,Stack Exchange是一个很棒的网站。但是在我看来,将它标记为“不是一个真正的问题”有点不公平。在Stack Exchange上,还有其他几个遵循“某种编程语言的编程范例是什么”模式的问题,并且这是一个可以明确回答的问题。我不明白为什么Wooble、Joris Meys、Dirk Eddelbuettel、Andrie和Chase会对此进行标记。 - user438602
如果您强烈反对关闭此问题,您可以对其进行标记以引起管理员的注意,或在Meta上发布一个关于它的问题。 - Matt Ball
2
重新开启问题,因为我倾向于同意这个请求,即这并不是真正的离题。最多它可能是一个可以迁移到programmers.stackexchange.com的问题,但现在我只是重新打开它。 - Lasse V. Karlsen
2个回答

24

R支持面向对象和函数式编程范式的混合使用。

在函数式方面,它:

  • 有一等函数
  • 具有惰性求值的参数
  • 鼓励纯函数,避免产生副作用

但是

  • 它没有实现尾调用递归
  • 并且很容易创建非纯函数

在面向对象方面:

  • 它有三种内置的OO范例:S3和S4,它们是不可变的,并支持通用函数风格的OO,以及引用类(又称R5),它们是可变的,并支持更常见的消息传递风格的OO。

  • S4受到了Common Lisp(CLOS)和Dylan的OO风格的重要影响。

  • 还有许多贡献包提供其他类型的OO:protomutatrR.ooOOP

但是

  • 内置的OO工具在语法糖方面提供的很少。

5

根据维基百科(强调添加),

R支持使用函数进行过程式编程,同时也支持使用通用函数进行面向对象编程。通用函数会根据传递的参数类型而表现出不同的行为。换句话说,通用函数能够识别对象类型并选择(分派)特定于该类型对象的函数(方法)。例如,R拥有一个通用的print()函数,可以通过简单的“print(objectname)”语法打印R中几乎所有类型的对象。


R实际上是一种函数式编程语言,尽管不是像Lisp那样的纯函数式编程语言(就像它不是C语言中的过程式编程语言,也不是Java中的面向对象编程语言)。 - Joris Meys
你有任何支持这个观点的参考资料吗?R语言避免可变性并具有一级函数吗? - Matt Ball
好的。典型的维基百科解释。我早就停止查看维基百科了。我明白什么是泛型函数,但我不认为这与底层范式有关;你可以在任何具有函数的语言中使用泛型函数。仅仅因为有泛型函数并不会使它更具面向对象性质。 - user438602
@Matt Ball:请查看这个问题的答案:http://stackoverflow.com/questions/4874867/learning-functional-programming-with-r。维基百科并不总是正确的...;-) - Joris Meys
@gojira:要了解R语言中的面向对象编程范式,请查看S3和S4类,以及最近添加的引用(R5)类。整个Bioconductor项目(www.bioconductor.org)完全是面向对象的,使用S4类。但不是Java意义上的。 - Joris Meys
R5是一个误称,实际上并不存在。 - mdsumner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接