Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop R语言与面向对象编程_Oop_R - Fatal编程技术网

Oop R语言与面向对象编程

Oop R语言与面向对象编程,oop,r,Oop,R,在R中,以这样或那样的方式进行面向对象编程是非常可能的。但是,与例如Python不同,实现面向对象的方法有很多: 中三及中四班级 我的问题是: 在R中,这些OO编程方式的主要区别是什么 理想情况下,这里的答案将作为R程序员决定哪种OO编程方法最适合他们需要的参考 因此,我要求以客观的方式,根据经验,并以事实和参考为依据,提供细节。澄清这些方法如何映射到标准OO实践的额外积分。S3类 不是真正的对象,更多的是一种命名约定 以美国为基地。语法:例如,对于打印,print调用print.l

在R中,以这样或那样的方式进行面向对象编程是非常可能的。但是,与例如Python不同,实现面向对象的方法有很多:

  • 中三及中四班级
我的问题是:

在R中,这些OO编程方式的主要区别是什么

理想情况下,这里的答案将作为R程序员决定哪种OO编程方法最适合他们需要的参考


因此,我要求以客观的方式,根据经验,并以事实和参考为依据,提供细节。澄清这些方法如何映射到标准OO实践的额外积分。

S3类

  • 不是真正的对象,更多的是一种命名约定
  • 以美国为基地。语法:例如,对于打印,
    print
    调用
    print.lm
    print.anova
    等,如果未找到,则调用
    print.default
S4课程

  • 实现起来比S3更复杂
参考类

  • 主要用于避免复制大型对象(通过引用传递)
proto

  • ggplot2最初是用proto编写的,但最终将使用S3重写
  • 简洁的概念(原型,而不是类),但在实践中似乎很棘手
  • ggplot2的下一个版本似乎正在远离它
R6类

  • 不依赖于S4类
  • R6类与引用类类似,只是不需要将字段和方法分开,并且不能指定字段的类型

2012年3月8日编辑:下面的答案是对最初发布的一个问题的回应,该问题已被删除。我将其复制到下面,为我的答案提供上下文:

不同的OO方法如何映射到Java或Python中使用的更标准的OO方法


我的贡献与您的第二个问题有关,关于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')