R中是否可以使用自有类的对象?

时间:2011-05-26 17:55:32

标签: oop class r methods constructor

我是R-newbie,我想知道是否可以创建自己的类的对象。当我阅读“帮助(类)”时,似乎没有类似Java的类是可能的。我的意思是我想要一个包含方法,私有变量和构造函数的类。例如,它可能如下所示:

className <- class {
  # private variables
  var1 <- "standardvalue"

  var2 <- TRUE
  # Constructor
  constructor (v1, v2) {
    var1 <- v1
    var2 <- v2
  }

  # Method 1
  function sum() {
    var1 + var2
  }

  # Method 2
  function product() {
    var1 * var2
  }
}

在我的主程序中,我想创建一个这个类的Object并调用它的函数。例如:

# Create Object
numbers <- className(10,7)

# Call functions of the Object
numbers -> sum()      # Should give "17"
numbers -> product()  # Should give "70"

这样的事情可能吗?到目前为止,我没有任何例子。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

是的,在基地R中有(至少)三个OO系统可供选择:

  • S3
  • S4
  • ReferenceClasses

以及通过CRAN软件包(如proto)提供的其他类似OO的框架。

请为S3,S4,ReferenceClasses,OO,...做一些谷歌搜索,可能从rseek.org开始。所有R编程书籍都涵盖了这一点;我最喜欢的是Chambers(2008)一书名为“数据分析软件”。

答案 1 :(得分:0)

如果您来自ctypes因此习惯javaprivate属性和方法,我建议您使用public包。见link。从文档中获取的人员类的一个简单例子是:

R6

以下是如何创建此类的实例:

library(R6)
Person <- R6Class("Person",
  public = list(
    name = NA,
    hair = NA,
    initialize = function(name, hair) {
      if (!missing(name)) self$name <- name
      if (!missing(hair)) self$hair <- hair
      self$greet()
    },
    set_hair = function(val) {
      self$hair <- val
    },
    greet = function() {
      cat(paste0("Hello, my name is ", self$name, ".\n"))
    }
  )
)

请注意,与johnDoe <- Person$new("John Doe") johnDoe$set_hair("brown") 不同的方法是在对象之后使用java运算符调用。