Как расширить ссылочный класс, определенный в пакете 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
, что позволяет кросс-пакетное наследование без каких-либо проблем.