下面我创建了一个返回结构的函数,返回一个带有修改属性的新对象
f <- function(loc) {
structure(list(loc = loc , arg1=0 , c_val=c()),
class="myclass")
}
我对这段代码的理解是:将3个属性附加到对象列表中。
属性为loc,arg1
和c_val()
。名为myclass
的新类与此函数关联。
使用新函数如何为此结构添加值并维护状态?
答案 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)
loc
,arg1
和val
是内部列表结构的组件,有时也称为插槽。属性会有所不同。
使用您已经创建的构造函数,您可以免费获得许多方法,但您可以覆盖它们。
# 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包,zoo
,zooreg
,yearmon
和yearqtr
以及每个类的许多方法。