R: Нахождение структуры наследования классов в пакете R - PullRequest
0 голосов
/ 20 декабря 2018

Вы можете найти все объекты в пакете с помощью

objs <- mget(ls("package:base"), inherits = TRUE)

Вы можете выбрать функции из них с помощью

funs <- objs[is.function(objs)]

. Вы можете получить полный список зависимостейперечислил функции в пакете, применяя codetools::findGlobals(), miniCRAN::makeDepGraph, pkgnet::CreatePackageReport (или другие) к списку функций.Все эти функции либо отображают полученные зависимости, либо возвращают объект, который можно легко построить, например, igraph или DependenciesGraph.

Существует ли сопоставимый набор команд для поиска всех классов, созданных пакетом, иструктура наследования этих классов?Я знаю, что для большинства пакетов результирующая сеть наследования классов будет относительно простой, но я думаю, что в некоторых случаях, таких как ggplot2 и survey, результирующая сеть наследования классов может быть весьма полезна.

Я нашел пакет classGraph, который создает направленные ациклические графы для структур класса S4, но меня больше интересуют гораздо более распространенные структуры S3.

Это кажется грубой силой инебрежно, но я предполагаю, что если бы у меня был список всех атрибутов class, используемых объектами в базовых пакетах, и всех атрибутов class объектов в пакете, то любой из последних, которых нет среди первых, был быбыть новыми классами, созданными пакетом или унаследованными от другого неосновного пакета.

1 Ответ

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

Это немного сложно, так как я не знаю ни одного формального определения S3 class.Для объектов R классы S3 управляются очень простым символьным вектором имен классов, хранящимся в атрибуте class.Диспетчеризация метода выполняется путем сопоставления элемента (ов) этого атрибута с именем функции.

По сути, вы можете сделать:

x <- 1:5
class(x) <- "MyMadeUpClass"
x

# [1] 1 2 3 4 5
# attr(,"class")
# [1] "MyMadeUpClass"

Действительно ли вышеприведенное определяет класс в интуитивном формальномпонимание термина?

Вы можете создать метод print для объектов этого класса, например (входящий глупый пример):

print.MyMadeUpClass <- function(x, ...)  {
  print(sprintf("Pretty vector: %s", paste(x, collapse = ",")))
}
x 
# [1] "Pretty vector: 1,2,3,4,5"

Важным отличием здесь является то, что методы в S3

  • «принадлежат» (универсальные) функции, а не классы
  • выбираются на основе классов аргументов, предоставляемых для вызова функции

Точка Iя пытаюсь сделать так, чтобы у S3 на самом деле не было формально определенного наследования (которое, как я полагаю, и есть то, что вы ищете), в отличие от S4, который реализует это с помощью концепции contains, поэтому я не совсем уверен, чтоВы хотели бы видеть в результате.

Очень хорошее чтение по теме «Объектно-ориентированное программирование, функциональное программирование и R» Джона М. Чемберса: https://arxiv.org/pdf/1409.3531.pdf

Редактировать (послередактирование вопроса) - пакет sloop :

С точки зрения S3, я думаю, что имеет смысл рассмотреть структуру обобщений и методов.Пакет sloop очень полезен для этого: https://github.com/r-lib/sloop.

...