Size: a a a

R (язык программирования)

2020 December 08

ИП

Иван Поздняков... in R (язык программирования)
Жесть какая
источник

PU

Philipp Upravitelev in R (язык программирования)
Григорий Демин
Наверное, да. Можно попробовать схитрить и все сделать шаблонно. То есть вызвать NextMethod() , а потом восстанавливать атрибут класса
кажется, необязательно, можно просто сделать класс, "отнаследованный" от tibble
впрочем, это почти то же NextMethod и есть
источник

ГД

Григорий Демин... in R (язык программирования)
Да, если наследоваться, то скорее всего писать придется меньше. Правда, сохранение атрибута класса можно ломаться, если какой-нибудь filter об этом не заботится
источник

ИП

Иван Поздняков... in R (язык программирования)
Philipp Upravitelev
кажется, необязательно, можно просто сделать класс, "отнаследованный" от tibble
впрочем, это почти то же NextMethod и есть
а что ты имеешь в виду под наследованием здесь? навешивание нового аттрибута класса спереди или что-то более сложное?
источник

PU

Philipp Upravitelev in R (язык программирования)
Иван Поздняков
а что ты имеешь в виду под наследованием здесь? навешивание нового аттрибута класса спереди или что-то более сложное?
да, добавить в атрибут класса новое значение, чтобы была цепочка new_class > tibble > data.frame
источник

PU

Philipp Upravitelev in R (язык программирования)
а ты не хочешь просто переопределять summary для tibble в своей сессии?
источник

PU

Philipp Upravitelev in R (язык программирования)
кажется, это будет проще, чем свой класс пилить
источник

PU

Philipp Upravitelev in R (язык программирования)
ну или вообще создать свою my_summary и ее вызывать
источник

ИП

Иван Поздняков... in R (язык программирования)
вот с этого вопрос и начался. Очень многие функции, например, as_tibble() и as.data.table() обрезают этот рожденный в муках класс, оставляя только data.table и data.frame, например
источник

ИП

Иван Поздняков... in R (язык программирования)
ну, это для пакета: чтоб качаешь get_corpus(), а summary() на полученные данные выдавал бы красивое описание результатов внутри, учитывая специфику датасета
источник

ИП

Иван Поздняков... in R (язык программирования)
источник

ГД

Григорий Демин... in R (язык программирования)
Иван Поздняков
вот с этого вопрос и начался. Очень многие функции, например, as_tibble() и as.data.table() обрезают этот рожденный в муках класс, оставляя только data.table и data.frame, например
Ну вообще, по с
смыслу эти функции должны строго возвращать tibble и data.table иначе что-то уж совсем не так, если конвертация в класс возвращает не тот класс, который обещает
источник

PU

Philipp Upravitelev in R (язык программирования)
ну тогда да, свой подкласс и для него summary
я бы наверное так делал
источник

PU

Philipp Upravitelev in R (язык программирования)
Григорий Демин
Ну вообще, по с
смыслу эти функции должны строго возвращать tibble и data.table иначе что-то уж совсем не так, если конвертация в класс возвращает не тот класс, который обещает
+1
источник

ИП

Иван Поздняков... in R (язык программирования)
там я намудрил четыре s3 класса внутри пакета (это вообще мой первый, мол, не судите строго). Теперь вот вырезаю
источник

ИП

Иван Поздняков... in R (язык программирования)
Григорий Демин
Ну вообще, по с
смыслу эти функции должны строго возвращать tibble и data.table иначе что-то уж совсем не так, если конвертация в класс возвращает не тот класс, который обещает
ну, это верно, но ведь сами эти классы таки наследуются от датафрейма. Я бы вообще хотел сделать так, чтобы мой класс был первом в череде диспатчеризации, принимая и простые датафреймы, и тибблы, и дататейблы
источник

ИП

Иван Поздняков... in R (язык программирования)
и, например, as.data.table() и as_tibble() просто навешивал свой класс в серединку тогда. Тогда это был бы просто обычный датафрейм/дататейбл/тиббл, но с кастомным саммари и плотом, прописанными как методы для соотвествующих дженериков.
источник

PU

Philipp Upravitelev in R (язык программирования)
Иван Поздняков
ну, это верно, но ведь сами эти классы таки наследуются от датафрейма. Я бы вообще хотел сделать так, чтобы мой класс был первом в череде диспатчеризации, принимая и простые датафреймы, и тибблы, и дататейблы
не совсем так. к ним применяются те методы, которые не определены для этого класса, но определены для следующего в цепочке классов. это эрзац наследования, все же.
и по твоей логике наоборот, твой класс должен быть последним
источник

ИП

Иван Поздняков... in R (язык программирования)
последним где? наоборот же, первым на очереди: сначала проверяем, есть ли, например, method_name.corpus(), если не находится, то импользуется method_name.data.table()/method_name.tbl(), если не находится - method_name.data.frame(). Тогда класс должен быть c(«corpus», «data.table», «data.frame»). Я думал, это так работает
источник

PU

Philipp Upravitelev in R (язык программирования)
да, ты прав
плюс для датафрейма ты все равно суперкласс не сделаешь, это очень странный кадавр будет :)
источник