Oop R语言与面向对象编程
在R中,以这样或那样的方式进行面向对象编程是非常可能的。但是,与例如Python不同,实现面向对象的方法有很多:Oop R语言与面向对象编程,oop,r,Oop,R,在R中,以这样或那样的方式进行面向对象编程是非常可能的。但是,与例如Python不同,实现面向对象的方法有很多: 中三及中四班级 我的问题是: 在R中,这些OO编程方式的主要区别是什么 理想情况下,这里的答案将作为R程序员决定哪种OO编程方法最适合他们需要的参考 因此,我要求以客观的方式,根据经验,并以事实和参考为依据,提供细节。澄清这些方法如何映射到标准OO实践的额外积分。S3类 不是真正的对象,更多的是一种命名约定 以美国为基地。语法:例如,对于打印,print调用print.l
- 中三及中四班级
因此,我要求以客观的方式,根据经验,并以事实和参考为依据,提供细节。澄清这些方法如何映射到标准OO实践的额外积分。S3类
- 不是真正的对象,更多的是一种命名约定
- 以美国为基地。语法:例如,对于打印,
调用print
print.lm
等,如果未找到,则调用print.anova
print.default
- 实现起来比S3更复杂
- 主要用于避免复制大型对象(通过引用传递)
- ggplot2最初是用proto编写的,但最终将使用S3重写
- 简洁的概念(原型,而不是类),但在实践中似乎很棘手
- ggplot2的下一个版本似乎正在远离它
- 不依赖于S4类
- R6类与引用类类似,只是不需要将字段和方法分开,并且不能指定字段的类型
我的贡献与您的第二个问题有关,关于R的OO方法如何映射到更标准的OO方法。当我在过去思考这个问题时,我一次又一次地回到两段,一段是弗里德里希·莱希,另一段是约翰·钱伯斯。这两种语言都很好地解释了为什么R中类似OO的编程与许多其他语言有着不同的风格 首先,Friedrich Leisch,摘自“创建R包:教程”(): S是罕见的,因为它是交互式的,并且有一个面向对象的系统。设计类显然是编程,但要使S作为交互式数据分析环境发挥作用,它是一种函数式语言是有道理的。在“真实”的面向对象编程(OOP)语言中,如C++或java类和方法定义紧密地绑定在一起,方法是类的一部分(因此是对象)。我们需要增量和交互式的添加,比如预定义类的用户定义方法。这些添加可以在任何时间点进行,甚至在分析数据集时在命令行提示下进行。S试图在面向对象和交互使用之间做出折衷,尽管折衷对于他们试图达到的所有目标来说从来都不是最优的,但它们在实践中往往表现得出奇地好 另一段来自约翰·钱伯斯的名著。(): OOP编程模型与S语言在所有方面都不同,但第一个不同 尽管S和其他一些函数式语言支持类 和方法。OOP系统中的方法定义是类的本地定义; 没有要求方法的相同名称意味着相同 一个无关类的东西。与此相反,R中的方法定义没有 驻留在类定义中;从概念上讲,它们与泛型关联 功能。类定义直接输入到确定方法选择中 或者通过继承。习惯于OOP模型的程序员有时会 对他们的编程没有直接转移到R感到沮丧或困惑, 但它不能。方法的功能性使用更为复杂,但是 更适合具有有意义的功能,并且不能简化为 面向对象版本
S3和S4似乎是面向对象编程的官方(即内置)方法。我已经开始使用S3与构造函数/方法中嵌入的函数的组合。我的目标是有一个object$method()类型的语法,这样我就有了半私有字段。我之所以说半隐私是因为没有办法真正隐藏它们(据我所知)。下面是一个简单的例子,实际上什么都不做:
#' Constructor
EmailClass <- function(name, email) {
nc = list(
name = name,
email = email,
get = function(x) nc[[x]],
set = function(x, value) nc[[x]] <<- value,
props = list(),
history = list(),
getHistory = function() return(nc$history),
getNumMessagesSent = function() return(length(nc$history))
)
#Add a few more methods
nc$sendMail = function(to) {
cat(paste("Sending mail to", to, 'from', nc$email))
h <- nc$history
h[[(length(h)+1)]] <- list(to=to, timestamp=Sys.time())
assign('history', h, envir=nc)
}
nc$addProp = function(name, value) {
p <- nc$props
p[[name]] <- value
assign('props', p, envir=nc)
}
nc <- list2env(nc)
class(nc) <- "EmailClass"
return(nc)
}
#' Define S3 generic method for the print function.
print.EmailClass <- function(x) {
if(class(x) != "EmailClass") stop();
cat(paste(x$get("name"), "'s email address is ", x$get("email"), sep=''))
}
#构造函数
EmailClass关于参考课程的信息:谢谢,你能重新发布链接作为答案吗?如果你能提供一个关于什么是参考类的小结,以及为什么它们比S3/S4类更可取,那就太好了。一只小鸟悄悄地对我说,约翰·钱伯斯即将出版一本关于这方面的书。但是不要告诉任何人我说过…;-)同一只小鸟能在下面粘贴一个答案,再加上一些参考类的信息吗如果您还有其他差异需要添加,请随意编辑。如果它变成CW,我不会哭:-)别忘了库(“财富”);《财富》(“海峡”)
关于S4课程的讨论:。一般的感觉似乎是,它们比它们提供的优势更麻烦。有趣的是,新的R6类通过避免使用该数字隐式地承认引用类是R5。让争论重新开始吧。R5这个名字最初被引用类开发人员以外的人用作玩笑。R6这个名字是对“R5”的认可,但它并不意味着R5这个名字有任何官方认可。你是在“手工”重新发明引用类
test <- EmailClass(name="Jason", "jason@bryer.org")
test$addProp('hello', 'world')
test$props
test
class(test)
str(test)
test$get("name")
test$get("email")
test$set("name", "Heather")
test$get("name")
test
test$sendMail("jbryer@excelsior.edu")
test$getHistory()
test$sendMail("test@domain.edu")
test$getNumMessagesSent()
test2 <- EmailClass("Nobody", "dontemailme@nowhere.com")
test2
test2$props
test2$getHistory()
test2$sendMail('nobody@exclesior.edu')