5

我想在 R 中定义一个新的对象类,它带有自己的功能(例如获取最大值的 getter)。是否有可能在 R 中实现这一点?我在想类似的东西:

test <- class() {
  len = 0     # object variable1

  __constructor(length=0) {
    len = length # set len
  }

  getLength <- function() {
    len   # return len
  }
}

ob = test(20)    # create Objectof class test
ob.getLength()   # get Length-Value of Object
4

2 回答 2

8

为了让你开始,我将举一个S3类的例子:

# create an S3 class using setClass:
setClass("S3_class", representation("list"))
# create an object of S3_class
S3_obj <- new("S3_class", list(x=sample(10), y=sample(10)))

现在,您可以对内部函数进行函数重载,例如,length将函数作为(您也可以operator-overload)作用于您的类:

length.S3_class <- function(x) sapply(x, length)
# which allows you to do:
length(S3_obj)

#  x  y 
# 10 10 

或者,您可以使用任何名称拥有自己的函数,您可以在其中检查对象是否属于类S3_class并执行某些操作:

len <- function(x) { 
    if (class(x) != "S3_class") {
        stop("object not of class S3_class")
    }
    sapply(x, length)
}

> len(S3_obj)
#  x  y 
# 10 10 

> len(1:10)
# Error in len(1:10) : object not of class S3_class

解释 S4(如 S3)有点困难,因为有很多术语和事情要知道(它们并不难,只是不同)。我建议您浏览这些评论下提供的链接(以及 S3,因为我在这里的目的是向您展示它是如何完成的示例)。

于 2013-03-06T10:15:50.563 回答
6

R 也有函数闭包,非常适合您的示例

test = function() {
  len = 0
  set_length = function(l = 0) len <<-l
  get_length = function() len
  return(list(set_length=set_length, get_length=get_length))
}

这给出了:

R> m = test()
R> m$set_length(10)
R> m$get_length()
[1] 10
R> m$set_length()
R> m$get_length()
[1] 0
于 2013-03-06T11:02:13.973 回答