R 调用S4或引用类中的多个插槽或字段

R 调用S4或引用类中的多个插槽或字段,r,s4,reference-class,R,S4,Reference Class,是否可以调用或设置多个插槽的值 A<-setClass(Class="A",slot=c(name="character",type="character")) a<-A() slot(object,c("name","type"),check=T) A在S4中,默认的initialize方法允许写入 A <- setClass(Class="A", slot=c(name="character",type="character")) a <- A(name="abc"

是否可以调用或设置多个插槽的值

A<-setClass(Class="A",slot=c(name="character",type="character"))
a<-A()
slot(object,c("name","type"),check=T)

A在S4中,默认的
initialize
方法允许写入

A <- setClass(Class="A", slot=c(name="character",type="character"))
a <- A(name="abc", type="def")
initialize(a, name="cde", type="fgh")

A这个答案适用于参考类

让我们从
AB
的最简单定义开始,不使用任何方法

AB <- setRefClass(
  "AB", 
  fields = list(
    name = "character"
  )
)
可以自动生成访问器方法来获取和设置名称字段

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$方法(
setName=函数(x)
{
如果(长度(x)>1)
{
警告(“仅使用第一个字符串”)

x固定标题“R5”只是一个不会消亡的迷因。感谢您帮助消除了这个不会消失的迷因…所以我必须遵循这个原则?'AB.getFieldsMany thx寻求帮助。要找到关于它的信息,比在Java、PHP或其他一些Commo语言中找到它要困难得多。@Klaus目前对引用类的帮助非常有限。从
?ReferenceClasses
帮助页面和我的书《学习R.:)的第16章Thx,这就是我建议的没有向量化函数的地方。@Klaus:你可能想看看lattice中的
modifyList
函数,了解有关递归结构“定向”修改的想法。
AB <- setRefClass(
  "AB", 
  fields = list(
    name = "character"
  )
)
ab <- AB$new(name = "ABC")
ab$name
## [1] "ABC"
(ab$name <- "ABCD")
## [1] "ABCD"
AB$accessors("name")
ab$getName()
ab$setName("ABCDE")
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
    }
  )
)