R Вызов внутренней функции из экспортированной функции внутри пакета

Я создаю пакет R в RStudio. Скажем, у меня есть две функции fnbig() и fnsmall() в моем пакете с именем foo. fnbig() — это функция, которая должна быть доступна пользователю, использующему пакет. fnsmall() — это внутренняя функция, которая не должна быть доступна пользователю, но должна быть доступна внутри fnbig().

# package code
fnsmall <- function()
{
bla bla..
}

#' @export
fnbig <- function()
{
bla bla..
x <- fnsmall()
bla..
}

Я попытался экспортировать fnsmall(). Все работает, но засоряет пространство имен. Я пробовал не экспортировать fnsmall(), но тогда он не работал внутри fnbig() при использовании x <- fnsmall() или x <- foo::fnsmall(). Затем я попытался использовать x <- foo:::fnsmall(), и это сработало. Но я читал, что использовать ::: не рекомендуется.

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


person rmf    schedule 04.01.2016    source источник
comment
Код, который вы разместили, должен работать как есть. Не могли бы вы поделиться более подробной информацией о том, как воспроизвести проблемы, которые вы видите?   -  person krlmlr    schedule 19.01.2016
comment
У меня похожая проблема. В ваших сообщениях об ошибках указано, что fnbig не экспортируется, или они жалуются на то, что fnsmall не экспортируется?   -  person eric_kernfeld    schedule 10.08.2017


Ответы (1)


Но я читал, что использование ::: не рекомендуется.

Я думаю, вы упомянули об этом на основании следующего утверждения в руководстве по написанию пакетов Р.

Использование foo:::f вместо foo::f позволяет получить доступ к неэкспортированным объектам. Как правило, это не рекомендуется, так как семантика неэкспортируемых объектов может быть изменена автором пакета в ходе текущего обслуживания.

Причина, по которой это не рекомендуется, заключается в том, что неэкспортированные функции не имеют документации и, как таковые, не имеют гарантии со стороны автора пакета, что они будут продолжать делать то, что делают сейчас.

Однако, поскольку вы имеете в виду свои собственные неэкспортированные функции, вы имеете полный контроль над тем, что происходит в этих функциях, поэтому это возражение не столь актуально.

Поэтому обращение к нему как foo:::fnsmall является хорошим вариантом.

person JAD    schedule 12.09.2017