【发布时间】:2015-01-09 22:49:36
【问题描述】:
我如何从包(导出)函数中检查当前函数执行是否已由该包中的函数调用或由外部包/全局环境调用。
我目前通过实验开发的方法:
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()} -
如果有一个在另一个包中构建的匿名函数的示例来进行测试,那就太好了。
-
@Dason 测量函数调用的时间,不包括我的包调用。
.fun在我的情况下是不可能的。