В моем пакете 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, чтобы все заработало ... Но какой поворот, я не знаю.
Любая помощь очень ценится.