我是一名统计学研究生,与R一起工作很多。我在其他编程环境中熟悉OOP。我甚至看到它在各种统计包中的使用,这些包定义了用于存储数据的新类。
在我毕业生的这个阶段,我通常会编写一些算法来进行某些类的分配 - 这需要原始数据并提供某种输出。我希望能够更容易地重用代码,并建立良好的编码习惯,特别是在我进行更多涉及的研究之前。请在R中进行统计编程时提供一些关于如何“思考OOP”的建议。
答案 0 :(得分:7)
我认为你不应该这样做。尝试在工作流程方面考虑R.此页面上有一些有用的工作流程建议:
Workflow for statistical analysis and report writing
另一个重要的考虑因素是逐行分析与可重复研究。这里有一个很好的讨论:
writing functions vs. line-by-line interpretation in an R workflow
答案 1 :(得分:5)
OOP的两个方面是数据和对数据进行操作的泛型/方法。
数据(尤其是作为分析输出的数据)通常由结构化和相互关联的数据框或其他对象组成,并且希望以协调的方式管理这些数据。因此,OOP的类概念,作为组织复杂数据的一种方式。
泛型和实现它们的方法代表对数据执行的常见操作。当一组泛型在概念上相关的类中一致地运行时,它们的实用性就来了。也许一个合理的例子是lm / glm作为类的输出,以及summary,anova,predict,residuals等作为泛型和方法的实现。
许多分析都遵循熟悉的工作流程;这里有一个类和方法的用户,并获得协调数据+熟悉的泛型的好处。思考'OOP'可能会引导您探索对象上的方法,而不是它的结构,并可能帮助您构建工作流程,以便它们遵循明确定义的通道已建立的课程和方法。
实现一种新颖的统计方法,人们可能会考虑如何将结果组织成一个表示为新类的连贯的,相互关联的数据结构,并编写与类似类上已建立的方法相对应的类的方法。在这里,人们可以通过便于后续计算的方式在内部表示数据,而不是用户可能想要“看到”它(将表示与接口分开)。对于您班级的用户来说很容易(正如Chambers所说,经常自己)在现有工作流程中使用新班级。
在'如何操作'之前询问'为什么是OOP'是一个有用的问题。
答案 2 :(得分:4)
您可能需要查看以下链接:first one,second one。
如果你想在R中看到一些严肃的OO代码,请阅读ReferenceClasses
的手册页(所谓的R5面向对象),并查看Rook
包,因为它严重依赖于ReferenceClasses
。 BTW,Rook
是在R编码中合理使用R5的一个很好的例子。以前使用JAVA
或C++
的经验可能会有所帮助,因为R5方法调度与S3不同。实际上,S3 OO非常原始,因为实际的“类”被保存为对象属性,所以你可以很容易地改变它。
S3: <method>.<class>(<object>) R5: <object>$<method>
无论如何,如果你能拿到一份副本,我建议:“坚果壳里的R”,第10章。
答案 3 :(得分:3)
我对如何有效地使用R知之甚少,但是这里有一篇文章甚至允许我以OO的方式使用R:
http://www.ibm.com/developerworks/linux/library/l-r3/index.html
答案 4 :(得分:1)
我对David Mertz的说法不以为然“方法包仍然有点试探性的,但是在BiggsTRC回答的链接中提到的一些经过适当调整的版本似乎肯定会在后来的R版本中继续使用。”在我看来,使用类和方法编程并使用方法包(S4)是在R中“思考OOP”的正确方法。
John M. Chambers的“数据分析软件”(2008)第9.2章“使用新类编程”(第335页)的最后一段指出: “使用新类所涉及的编程量可能比定义类所涉及的程序要多得多。您应该为新类的用户提供尽可能有效的编程(即使您希望成为自己的编程)因此,本章和第10章[“方法和通用函数”]中的编程风格有些不同并不是巧合。我们在这里做了一些更严肃的编程。“
考虑研究方法包(S4)。
答案 5 :(得分:0)
除了这里的其他一些好的答案(例如Nutshell章节中的R等),你应该看一下核心的Bioconductor软件包。 BioC一直专注于使用S4类的强大OOP设计。