R:如何修改插槽值?

时间:2018-11-13 10:35:48

标签: r oop

我是R的新手,并且使用一种名为“ show”的方法定义了一个对象。在这种方法中,我修改插槽的值,然后打印以显示其值。该值是正确的。

方法(显示)

setMethod("show", "menu", function(object){
  while (TRUE){
    #Clean console
    cat("\014")
    cat("COMPARATIVA ENTRE EQUIPOS DE LA MISMA COMPETICION\n")
    cat("-------------------------------------------------\n\n")
    cat("1. Comparativa entre clubes de Liga DIA\n")
    cat("2. Comparativa entre clubes de Liga Femenina 2 - Grupo 'A'\n")
    cat("3. Comparativa entre clubes de Liga Femenina 2 - Grupo 'B'\n")
    cat("0. Salir\n\n")
    option <- readline("Selecciona opción: ")
    option <- suppressWarnings(as.numeric(option))
    if (!is.na(option)){
      if (option == 1){
        object@competition <- 14
      }
      if (option == 2){
        object@competition <- 22
      }
      if (option == 3){
        object@competition <- 23
      }
      print(object@competition)
      readline("Espera ...")
      if (option == 0)
        break
    }else{
      readline("No es un número. Pulsa una tecla para introducir otra opción.")
    }
  }  
})

但是,如果我尝试使用此方法之外的位置访问广告位,那么我将获得初始值。

x <- menu(competition=0, stats=0)
x
print(x@competition)

当我调用“ x”时,我也调用了“ show”方法,在其中,我给“ competition”赋了一个不同于0的值。但是,稍后,当我尝试使用print(x @competition),结果为0。

> print(x@competition)
[1] 0

我想获得在“ show”方法中分配的值,但是在创建对象时已经得到了值。如何正确修改插槽的值?

1 个答案:

答案 0 :(得分:1)

好的,以下几行对我有帮助:

myFun <- function(object) 0
setGeneric("myFun")
setClass("myClass", slots = c("competition", "stats"))

然后我继续执行您的代码(对setMethod进行了一些修改):

setMethod("myFun", "myClass", function(object){
  while (TRUE){
    #Clean console
    cat("\014")
    cat("COMPARATIVA ENTRE EQUIPOS DE LA MISMA COMPETICION\n")
    cat("-------------------------------------------------\n\n")
    cat("1. Comparativa entre clubes de Liga DIA\n")
    cat("2. Comparativa entre clubes de Liga Femenina 2 - Grupo 'A'\n")
    cat("3. Comparativa entre clubes de Liga Femenina 2 - Grupo 'B'\n")
    cat("0. Salir\n\n")
    option <- readline("Selecciona opción: ")
    option <- suppressWarnings(as.numeric(option))
    if (!is.na(option)){
      if (option == 1){
        object@competition <- 14
        break
      }
      if (option == 2){
        object@competition <- 22
        break
      }
      if (option == 3){
        object@competition <- 23
        break
      }
      print(object@competition)
      readline("Espera ...")
      if (option == 0)
        break
    }else{
      readline("No es un número. Pulsa una tecla para introducir otra opción.")
    }
  }
return(object)  
})

这是我的输出:

x <- new("myClass", competition = 0, stats = 0)
# printing just x yields:
An object of class "myClass"
Slot "competition":
[1] 0

Slot "stats":
[1] 0

# Here is what myFun(x) yields:
COMPARATIVA ENTRE EQUIPOS DE LA MISMA COMPETICION
-------------------------------------------------

1. Comparativa entre clubes de Liga DIA 
2. Comparativa entre clubes de Liga Femenina 2 - Grupo 'A'
3. Comparativa entre clubes de Liga Femenina 2 - Grupo 'B'
0. Salir

Selecciona opción:
# hits 1
An object of class "myClass"
Slot "competition":
[1] 14

Slot "stats":
[1] 0

现在设置y <- myFun(x),我们获得(再次在控制台中点击1):

> print(y@competition)
[1] 14