s3初学者 - 如何使用新的s3结构?

时间:2017-12-02 15:30:17

标签: r

下面我创建了一个返回结构的函数,返回一个带有修改属性的新对象

f <- function(loc) {
  structure(list(loc = loc , arg1=0 , c_val=c()),
            class="myclass")
}

我对这段代码的理解是:将3个属性附加到对象列表中。 属性为loc,arg1c_val()。名为myclass的新类与此函数关联。

使用新函数如何为此结构添加值并维护状态?

2 个答案:

答案 0 :(得分:1)

您的问题的摘要答案是,您需要创建getter和setter函数作为对象定义的一部分,并在使用list()生成对象时为它们指定名称。

myObject <- function(x){
     # create attributes
     attribute1 <- NULL
     attribute2 <- NULL
     # create getter and setter functions, using <<- form of assignment operator
     setAttribute1 <- function(x) attribute1 <<- x
     getAttribute1 <- function() attribute1
     setAttribute2 <- function(x) attribute2 <<- x
     getAttribute2 <- function() attribute2
     list(setAttribute1 = setAttribute1,
          getAttribute1 = getAttribute1,
          setAttribute2 = setAttribute2,
          getAttribute2 = getAttribute2)
}

命名list()函数中的函数是关键步骤,因为它允许您通过提取运算符的$形式访问函数。

定义了我们的对象后,让我们使用它来设置和获取attribute1的值。

x <- myObject()

x$setAttribute1(15)
x$getAttribute1()

此代码生成以下输出到R控制台。

> x <- myObject()
> 
> x$setAttribute1(15)
> x$getAttribute1()
[1] 15
> 

有关此主题的更多详细信息,包括使用<<-形式的赋值运算符的背景,我将向您介绍我为约翰霍普金斯大学 R编程<编写的文章< / em>课程中解决此特定问题的课程Demystifying makeVector()

答案 1 :(得分:1)

locarg1val是内部列表结构的组件,有时也称为插槽。属性会有所不同。

使用您已经创建的构造函数,您可以免费获得许多方法,但您可以覆盖它们。

# create a new object
obj <- f(1)

# get arg1
obj$arg1
## [1] 0

# update arg1
obj$arg1 <- 2

# get arg1
obj$arg1
## [1] 2

print(obj)

最后一个给出:

$loc
[1] 1

$arg1
[1] 2

$c_val
NULL

attr(,"class")
[1] "myclass"

定义自定义打印方法:

print.myclass <- str
print(obj)

给出:

List of 3
 $ loc  : num 1
 $ arg1 : num 2
 $ c_val: NULL
 - attr(*, "class")= chr "myclass"

定义自定义getter:

`$.myclass` <- function(x, name) {
   cat("getting", name, "\n")
   .subset2(x, name)
}
obj$arg1

,并提供:

getting arg1 
[1] 2

如果您需要示例,请参阅定义S3类的zoo包,zoozooregyearmonyearqtr以及每个类的许多方法。