【问题标题】:R check if function in a package was called from the package fun or externallyR 检查包中的函数是从包 fun 还是从外部调用的
【发布时间】: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 &lt;- function(){your_internal_function}fun &lt;- function(){cat("whatever"); .fun()}
  • 如果有一个在另一个包中构建的匿名函数的示例来进行测试,那就太好了。
  • @Dason 测量函数调用的时间,不包括我的包调用。 .fun 在我的情况下是不可能的。

标签: r devtools


【解决方案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

【讨论】:

  • 太棒了!看起来正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2021-10-15
  • 2018-09-21
相关资源
最近更新 更多