Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.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
可以定义在R中有自己方法的对象类吗_R_Oop_Object - Fatal编程技术网

可以定义在R中有自己方法的对象类吗

可以定义在R中有自己方法的对象类吗,r,oop,object,R,Oop,Object,我想在R中定义一个新的对象类,它具有自己的功能(例如getter for maximum value)。有可能在R中实现这一点吗?我在想这样的事情: test <- class() { len = 0 # object variable1 __constructor(length=0) { len = length # set len } getLength <- function() { len # return len } }

我想在R中定义一个新的对象类,它具有自己的功能(例如getter for maximum value)。有可能在R中实现这一点吗?我在想这样的事情:

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

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

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

为了让您开始学习,我将给出一个关于
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)))
或者,您可以使用任何名称拥有自己的函数,您可以检查对象是否属于类
S3\u 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
len len(S3_obj)
#xy
# 10 10 
>莱恩(1:10)
#len中的错误(1:10):对象不属于S3类

解释S4(如S3)有点困难,因为有很多术语和东西需要知道(它们并不难,只是不同)。我建议您浏览评论下提供的链接(对于S3也是如此,因为我在这里的目的是向您展示一个如何完成的示例)。

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))
}

也许您应该阅读devtools wiki的“面向对象编程”部分:R有
S3
S4
an
R5
面向对象的概念。您必须选择一个,然后定义自己的函数(S3)或方法(S4、R5)。启动…相关:
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
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