Моя универсальная функция S3 перестает работать после вызова функции печати в R

#r #oop

#r #ооп

Вопрос:

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

Однако после того, как я запускаю print, исходная функция выдает результат print, а не тот результат, который я хочу, чтобы он выдавал.

Это мои методы:

 fisher <- function(obj, ...){
  UseMethod("fisher")
}

fisher.default <- function(obj, ...){
  x<- -2*sum(log(obj))
  df <- 2*length(obj)
  p = pchisq(x, df,lower.tail = FALSE)
  class(p)="fisher"
  p
}

print.fisher <- function(print_obj){
  paste("The p-value of this vector is: ", print_obj)

}

xx= fisher(x)
 

fisher перед созданием и выполнением print.fisher функции все работало отлично. Теперь fisher(x) выдает точный вывод как print(xx) .

Что может быть не так?

Комментарии:

1. у вас нет функции fisher , определенной в вопросе

2. fisher<-function(obj, ...) UseMethod("fisher") , как говорит @rawr.

3. Извините, я сначала не включил универсальную функцию в свой вопрос. Конечно, это было в моем коде. Только что отредактировал свой пост.

4. Переписать как print(paste("The p-value of this vector is: ", print_obj)) .

5. print(paste("The p-value of this vector is: ", print_obj)) тоже не сработало.

Ответ №1:

Со мной работает следующее. R 4.0.3 в Ubuntu 20.10.

 fisher <- function(x, ...){
  UseMethod("fisher")
}

fisher.default <- function(x, ...){
  y <- -2*sum(log(x))
  df <- 2*length(x)
  p <- pchisq(y, df, lower.tail = FALSE)
  class(p) <- c("fisher", class(p))
  p
}

print.fisher <- function(x, ...){
  y <- paste("The p-value of this vector is:", unclass(x))
  print(y)
  invisible(y)
}

set.seed(2020)
x <- abs(rnorm(10))
xx <- fisher(x)
xx
#[1] "The p-value of this vector is: 0.985718045451049"
 

Запуск функции без назначения выходных данных также вызывает пользовательский метод печати.

 fisher(x)
#[1] "The p-value of this vector is: 0.985718045451049"
 

Комментарии:

1. Я попробовал ваш метод, и хотя ‘print (xx)` отображал результат, fisher(x) после его запуска ничего не отображалось. Разве она не должна отображать значение и класс? (извините за мои обычные вопросы, я все еще новичок в R).