Как я могу проверить изнутри функции пакета (экспортируемой), было ли текущее выполнение функции вызвано функцией из этого пакета или оно было вызвано внешним пакетом/из глобальной среды.
Мой текущий подход, разработанный путем экспериментов:
myfun <- function(){
current_call = sys.call()
parent_call = sys.call(sys.parent())
if(identical(current_call,parent_call) || !identical(environmentName(parent.env(environment(match.fun(parent_call[[1L]])))),"imports:mypkg")){
cat("called externally\n")
}
}
Кажется, что он не обрабатывает анонимные функции, созданные в других пакетах, которые зависят от моего пакета.
Не особенно связано с devtools
, но связано с разработкой пакета, с которым devtools
хорошо справляется.
Редактировать:
Цель состоит в том, чтобы вызвать действие (cat()
в приведенном выше примере) в любых случаях, кроме вызовов из других моих функций в том же пакете.
.fun <- function(){your_internal_function}
иfun <- function(){cat("whatever"); .fun()}
- person Dason   schedule 10.01.2015.fun
в моем случае было бы невозможно. - person jangorecki   schedule 10.01.2015verbose
, для которого вы установили значение TRUE по умолчанию, который контролирует, печатаются ли материалы. В любом случае это, вероятно, будет лучшим подходом, позволяющим пользователю отключать печать при необходимости. - person Dason   schedule 10.01.2015pkgB::myfun()
. Он работает нормально с решением из вашего ответа. - person jangorecki   schedule 10.01.2015