R检查包中的函数是从包中调用还是从外部调用

时间:2015-01-09 22:49:36

标签: r devtools

如果当前函数执行已被该包中的函数调用,或者外部包/来自全局环境调用它,我如何从包(导出)函数中检查。

我目前的方法,通过试验开发:

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()),除了来自我在同一个包中的其他函数的调用。

1 个答案:

答案 0 :(得分:4)

借用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