R检查包中的函数是从包fun还是外部调用的
R check if function in a package was called from the package fun or externally
如果当前函数执行是由该包中的函数调用的,或者它是由外部包/全局环境调用的,我如何从包(导出的)函数中检查。
我目前的方法,通过实验开发:
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()
),但同一包中我的其他函数的调用除外。
借用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
如果当前函数执行是由该包中的函数调用的,或者它是由外部包/全局环境调用的,我如何从包(导出的)函数中检查。
我目前的方法,通过实验开发:
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()
),但同一包中我的其他函数的调用除外。
借用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