是否可以为多个插槽调用或设置值?
A<-setClass(Class="A",slot=c(name="character",type="character"))
a<-A()
slot(object,c("name","type"),check=T)
我是否必须编写自己的getSlot和setSlot方法?在R5中如何做到这一点?
AB <- setRefClass("AB", fields=c(name="character"),
methods=list(getName=AB.getName)
)
AB.getName<-function(object){
object$name
}
a<-AB(name="abc")
AB.getName(a)
答案 0 :(得分:4)
在S4中,默认的initialize
方法允许用户编写
A <- setClass(Class="A", slot=c(name="character",type="character"))
a <- A(name="abc", type="def")
initialize(a, name="cde", type="fgh")
您自己的初始化方法(如果有的话 - I think通常最好避免它们)必须编写以允许此用途。没有将S4表示转换为列表的默认方式。
您可以将这些想法纳入您自己的仿制品/方法中,例如
setGeneric("values", function(x, ...) standardGeneric("values"))
setMethod("values", "A", function(x, ...) {
slts = slotNames(x)
lapply(setNames(slts, slts), slot, object=x)
})
setGeneric("values<-", function(x, ..., value) standardGeneric("values<-"))
setReplaceMethod("values", c(x="A", value="list"), function(x, ..., value) {
do.call("initialize", c(x, value))
})
与
> a <- A(name="abc", type="def")
> values(a) = list(name="cde", type="fgh")
> values(a)
$name
[1] "cde"
$type
[1] "fgh"
答案 1 :(得分:4)
这个答案适用于参考类。
让我们从最简单的AB
定义开始,没有任何方法。
AB <- setRefClass(
"AB",
fields = list(
name = "character"
)
)
您可以使用与列表相同的方式检索name
字段的值。
ab <- AB$new(name = "ABC")
ab$name
## [1] "ABC"
(ab$name <- "ABCD")
## [1] "ABCD"
可以自动生成访问器方法以获取和设置名称字段。
AB$accessors("name")
ab$getName()
ab$setName("ABCDE")
这实在是没有意义,因为它具有与以前完全相同的行为,但更多的输入。在设置字段时,可以使用输入检查(或其他自定义行为)。为此,您可以添加自己编写的setName
方法。
AB$methods(
setName = function(x)
{
if(length(x) > 1)
{
warning("Only using the first string.")
x <- x[1]
}
name <<- x
}
)
ab$setName(letters)
## Warning message:
## In ab$setName(letters) : Only using the first string.
在分配引用类模板时,也可以(通常更有用)定义此方法。
AB <- setRefClass(
"AB",
fields = list(
name = "character"
),
methods = list(
setName = function(x)
{
if(length(x) > 1)
{
warning("Only using the first string.")
x <- x[1]
}
name <<- x
}
)
)
对评论的回应:
是的有效,但是:
getFieldNames
如果实施为names(AB$fields())
则更易于维护。
在setRefClass
中定义字段时,请使用列表。例如,list(name="character", var2="character")
。
分配引用类的实例时,请使用new
。例如,AB$new(name="abc",var2="abc")