R проверить, была ли функция в пакете вызвана из пакета fun или извне

Как я могу проверить изнутри функции пакета (экспортируемой), было ли текущее выполнение функции вызвано функцией из этого пакета или оно было вызвано внешним пакетом/из глобальной среды.

Мой текущий подход, разработанный путем экспериментов:

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() в приведенном выше примере) в любых случаях, кроме вызовов из других моих функций в том же пакете.


person jangorecki    schedule 09.01.2015    source источник
comment
Ваша формулировка сбивает с толку. Я не уверен, что понимаю вопрос. Можешь перефразировать?   -  person Alex W    schedule 10.01.2015
comment
Можете ли вы объяснить, почему вы хотите это сделать?   -  person Dason    schedule 10.01.2015
comment
У вас есть ответ ниже, но мне просто интересно, происходит ли распечатка get в начале или в конце функции? Если это так, вы можете просто сделать что-то вроде .fun <- function(){your_internal_function} и fun <- function(){cat("whatever"); .fun()}   -  person Dason    schedule 10.01.2015
comment
Было бы неплохо иметь пример анонимной функции, созданной в другом пакете для тестирования.   -  person GSee    schedule 10.01.2015
comment
@Dason измеряет время вызовов функций, за исключением вызовов моих пакетов. .fun в моем случае было бы невозможно.   -  person jangorecki    schedule 10.01.2015
comment
@JanGorecki Это может быть возможно, но мне нужно увидеть реальный вариант использования. Зная это, я бы, вероятно, просто добавил дополнительный параметр verbose, для которого вы установили значение TRUE по умолчанию, который контролирует, печатаются ли материалы. В любом случае это, вероятно, будет лучшим подходом, позволяющим пользователю отключать печать при необходимости.   -  person Dason    schedule 10.01.2015
comment
comment
@GSee Я только что проверил случай анонимной функции из pkgA, вызывающей зависимый pkgB::myfun(). Он работает нормально с решением из вашего ответа.   -  person jangorecki    schedule 10.01.2015


Ответы (1)


Заимствуя у data.table:::cedta, я поместил эти две функции в пакет под названием test.

myfun <- function() {
  te <- topenv(parent.frame(1))
  if(isNamespace(te) && getNamespaceName(te) == "test") { # <-- "test" is the name of the package
    cat("called from my package\n")
  } else cat("Not called from my package\n")
}

tester <- function() {
  myfun()
}

После загрузки пакета test я получаю следующие результаты

test:::myfun()
#Not called from my package
test:::tester()
#called from my package
person GSee    schedule 09.01.2015
comment
Большой! выглядит именно то, что я искал. - person jangorecki; 10.01.2015