Как расширить ссылочный класс, определенный в пакете R, который использует частные функции?

Исходя из аналогичного вопроса, я хотел бы иметь возможность разрешить пользователям расширять класс в моем пакете, который использует private (не export -ед) функции.

Минимальный рабочий пример:

# my_package/R/Main.R
# My package:
#' @import methods MASS
PrivateFunc <- function(...) fractions(0.5)     # a private function

#' @export Main
#' @exportClass Main
Main  <- setRefClass("Main",
    methods = list(
        initialize = function(...) PrivateFunc()
    )
)

Проблема в том, Main класс использует функции, которые не экспортируются из my_package, такие как PrivateFunc, а также fractions из пакета MASS который является Import а не Depends,

Таким образом, как только я создаю экземпляр класса, который расширяется Main R жалуется на невозможность видеть PrivateFunc:

library(my_package)
Child <- setRefClass("Child", contains = "Main")
Child()
# Error in .Object$initialize(...) : could not find function "PrivateFunc"

Значит ли это, что я вынужден export каждая частная функция используется Main? Разве это не сильно загрязнит глобальное пространство имен (именно поэтому я использую Imports над `Зависит)?

Так как лучше это исправить?

Изменить: Кроме того, есть возможность, что пользователь может расширить Main из своего собственного пакета, который они пишут

1 ответ

Решение

Это ограничение ссылочных классов. Я предлагаю проверить R6 (обратите внимание, что я автор). Смотрите ссылки на документацию внизу страницы проекта. В следующей версии есть опция под названием portable, что позволяет кросс-пакетное наследование без каких-либо проблем.

Другие вопросы по тегам