Невозможно вызвать функцию класса S3 в r - PullRequest
0 голосов
/ 30 апреля 2019

Я сделал функцию набора классов, которая возвращает список переменных с установленным классом.Вызов его выполняет запланированную работу, но когда сделан вызов связанной функции, вызов вводится в функцию по умолчанию.

classset <- function(stud= TRUE, res = pass) 
{
  entry = list(student = stud, result= res)
  class(entry) <- "registration"
  return(entry)
}

setrecord <- function(rec,newval)
{
  print("in setting")
  UseMethod("setrecord",rec)
}
setrecord.default <- function(m,n)
{
  print("in def")
  return(m)
}

setrecord.classset <- function(m,n){
  print("in class func")
  m$stud  <- aqqi
  m$res <- n
  return(m)
}

reh <- classset("aqqi","pass")
reh$student

[1] "aqqi"

reh$result

[1] "pass"

reh <- setrecord(reh,"fail") ##Expecting call to setrecord.classet

[1] "in setting"
[1] "in def"                   # expected to print "in class func"   

class(reh)
[1] "registration"

Я действительно ожидал вызова специфической для класса функции setrecord.classset.признателен, если кто-нибудь может указать, что я пропускаю в этом.

1 Ответ

2 голосов
/ 30 апреля 2019

Итак, проблема в том, что вы назвали не свой класс classset, а registration, как показано здесь:

classset <- function(stud= TRUE, res = pass) 
{
  entry = list(student = stud, result= res)
  class(entry) <- "registration" ### XXX: This is the name of the class
  return(entry)
}

Итак, нам нужно создать метод S3 для класса registration:

setrecord.registration <- function(m,n){
    print("in class func")
    m$stud  <- "aqqi" # Note I also had to add the quotation marks here
    m$res <- n
    return(m)
}
reh <- classset("aqqi","pass")
reh$student
# [1] "aqqi"
reh$result
# [1] "pass"
reh <- setrecord(reh,"fail") # Will call setrecord.registration()
# [1] "in setting"
# [1] "in class func"
reh
# $student
# [1] "aqqi"
# 
# $result
# [1] "pass"
# 
# $stud
# [1] "aqqi"
# 
# $res
# [1] "fail"
# 
# attr(,"class")
# [1] "registration"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...