我想在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
答案 0 :(得分: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,我的目的是向你展示一个如何完成的例子)。
答案 1 :(得分: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