R - проблемы с отправкой в ​​новый метод print.list () - PullRequest
0 голосов
/ 27 декабря 2018

В моем пакете summarytools я успешно определил метод print.by.Однако, несмотря на то, что я выполнил те же самые шаги для print.list, отправка не удалась.

Кажется, что метод зарегистрирован вместе с двумя другими методами печати, определенными в пакете:

grep("print(\\.summarytools$|\\.by$|\\.list$)", methods("print"), value = TRUE)
[1] "print.by"           "print.list"         "print.summarytools"

В NAMESPACE у меня есть:

S3method(print,by)
S3method(print,list)
S3method(print,summarytools)

Пример

devtools::install_github("dcomtois/summarytools", ref = "dev-current")
library(summarytools)
list_obj <- lapply(tobacco[,c(1,3)], freq))

## $gender
## For best results printing list objects with summarytools, use view(x, method = 'pander')
## Frequencies   
## tobacco$gender     
## Type: Factor   
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##           F    489     50.00          50.00     48.90          48.90
##           M    489     50.00         100.00     48.90          97.80
##        <NA>     22                               2.20         100.00
##       Total   1000    100.00         100.00    100.00         100.00
## 
## $age.gr
## Frequencies   
## tobacco$age.gr     
## Type: Factor   
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##       18-34    258     26.46          26.46     25.80          25.80
##       35-50    241     24.72          51.18     24.10          49.90
##       51-70    317     32.51          83.69     31.70          81.60
##        71 +    159     16.31         100.00     15.90          97.50
##        <NA>     25                               2.50         100.00
##       Total   1000    100.00         100.00    100.00         100.00

Сравнить с ...

summarytools:::print.list(list_obj)

## Frequencies   
## tobacco$gender     
## Type: Factor   
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##           F    489     50.00          50.00     48.90          48.90
##           M    489     50.00         100.00     48.90          97.80
##        <NA>     22                               2.20         100.00
##       Total   1000    100.00         100.00    100.00         100.00
##   
## tobacco$age.gr    
## Type: Factor   
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##       18-34    258     26.46          26.46     25.80          25.80
##       35-50    241     24.72          51.18     24.10          49.90
##       51-70    317     32.51          83.69     31.70          81.60
##        71 +    159     16.31         100.00     15.90          97.50
##        <NA>     25                               2.50         100.00
##       Total   1000    100.00         100.00    100.00         100.00

Вот содержимое print.list.R:

#' Print Method for Objects of Class \dQuote{list}.
#'
#' Displays a list comprised of summarytools objects created with \code{lapply}. 
#'
#' @usage
#'  \method{print}{list}(x, method = "pander", file = "", 
#'   append = FALSE, report.title = NA, table.classes = NA, 
#'   bootstrap.css = st_options('bootstrap.css'), 
#'   custom.css = st_options('custom.css'), silent = FALSE, 
#'   footnote = st_options('footnote'), 
#'   escape.pipe = st_options('escape.pipe'), \dots)
#' 
#' @inheritParams print.summarytools
#' @method print list
#' @export
print.list <- function(x, method = "pander", file = "", append = FALSE, 
                       report.title = NA, table.classes = NA, 
                       bootstrap.css = st_options('bootstrap.css'), 
                       custom.css = st_options('custom.css'),
                       silent = FALSE, footnote = st_options('footnote'), 
                       escape.pipe = st_options('escape.pipe'), ...) {
  if (inherits(x[[1]], "summarytools")) {
    view(x, method = method, file = file, append = append, 
         report.title = report.title, table.classes = table.classes, 
         bootstrap.css = bootstrap.css, custom.css = custom.css,
         silent = silent, footnote = footnote, escape.pipe = escape.pipe,
         ...)
  } else {
    base::print.default(x, ...)
  }
}

Я прочитал несколько документов, касающихся общих функций и их методов, но я не могу точно определить проблему или найти решение.Я посмотрел на функцию setMethod() и параметр «signature», но поскольку функция, скорее всего, будет вызываться без аргументов, я не понимаю, как это могло бы помочь.

Одно из различий между ними состоит в том, чтоprint.by существует в пакете base, а print.list - нет.Но я не мог понять, актуально это или нет.

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

Редактировать : я попробовал несколько других вещей, которые не работали ...

  • Переопределение print.default вместо определения print.list, как предлагалось здесь , но все равно не работает.
  • Добавление вызова setMethod после определения функции (setMethod(f = "print", signature = "list", definition = print.list));все еще нет хороших результатов (я не слишком уверен, что понимаю, какой должен быть аргумент «подписи». Я нахожу документацию об этом довольно запутанной).

Я начинаю думать тамможет быть, немного повороты, которые мне нужно сделать с Roxygen, чтобы все заработало ... Но какой поворот, я не знаю.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 31 декабря 2018

Как объяснено (несколько загадочно) в комментариях в исходном коде (доступно здесь ) и указано (более явно) в этом ответе переполнения стека, который цитирует их , "автоматическая печать"(что происходит, например, с (list_obj <- lapply(tobacco[,c(1,3)], freq))) может отправлять только явные классы, и поэтому не будет работать со списком.Он будет работать с любым вызовом на печать, хотя:

devtools::install_github("dcomtois/summarytools", ref = "dev-current", quiet = TRUE)
library(summarytools)
# For best results, consider updating pander to its most recent version. You can do so
# by using devtools::install_github('rapporter/pander')
list_obj <- lapply(tobacco[,c(1,3)], freq)
list_obj # will not work since it uses auto-printing
# $gender
# For best results printing list objects with summarytools, use view(x, method =
# 'pander')
# Frequencies   
# tobacco$gender     
# Type: Factor   
# 
#               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
# ----------- ------ --------- -------------- --------- --------------
#           F    489     50.00          50.00     48.90          48.90
#           M    489     50.00         100.00     48.90          97.80
#        <NA>     22                               2.20         100.00
#       Total   1000    100.00         100.00    100.00         100.00
# 
# $age.gr
# Frequencies   
# tobacco$age.gr     
# Type: Factor   
# 
#               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
# ----------- ------ --------- -------------- --------- --------------
#       18-34    258     26.46          26.46     25.80          25.80
#       35-50    241     24.72          51.18     24.10          49.90
#       51-70    317     32.51          83.69     31.70          81.60
#        71 +    159     16.31         100.00     15.90          97.50
#        <NA>     25                               2.50         100.00
#       Total   1000    100.00         100.00    100.00         100.00
print(list_obj) # will work
# Frequencies   
# tobacco$gender     
# Type: Factor   
# 
#               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
# ----------- ------ --------- -------------- --------- --------------
#           F    489     50.00          50.00     48.90          48.90
#           M    489     50.00         100.00     48.90          97.80
#        <NA>     22                               2.20         100.00
#       Total   1000    100.00         100.00    100.00         100.00
#   
# tobacco$age.gr    
# Type: Factor   
# 
#               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
# ----------- ------ --------- -------------- --------- --------------
#       18-34    258     26.46          26.46     25.80          25.80
#       35-50    241     24.72          51.18     24.10          49.90
#       51-70    317     32.51          83.69     31.70          81.60
#        71 +    159     16.31         100.00     15.90          97.50
#        <NA>     25                               2.50         100.00
#       Total   1000    100.00         100.00    100.00         100.00
...