【发布时间】:2020-12-02 09:48:50
【问题描述】:
我正在尝试跟踪从控制台调用某些函数的次数。 我的计划是在每个函数中添加一个简单的函数,例如“trackFunction”,以检查它们是从控制台调用还是作为底层函数调用。
尽管这个问题听起来很简单,但由于我在函数编程方面的知识有限,我无法找到一个好的解决方案。我一直在查看调用堆栈和 rlang::trace_back 但没有一个好的解决方案。
感谢任何帮助。
谢谢
【问题讨论】:
我正在尝试跟踪从控制台调用某些函数的次数。 我的计划是在每个函数中添加一个简单的函数,例如“trackFunction”,以检查它们是从控制台调用还是作为底层函数调用。
尽管这个问题听起来很简单,但由于我在函数编程方面的知识有限,我无法找到一个好的解决方案。我一直在查看调用堆栈和 rlang::trace_back 但没有一个好的解决方案。
感谢任何帮助。
谢谢
【问题讨论】:
一种简单的方法是查看当前帧位于哪个级别。也就是说,如果直接在解释器中调用函数,则sys.nframe()返回1,否则返回2或更高。
相关:
Rscript detect if R script is being called/sourced from another script
myfunc <- function(...) {
if (sys.nframe() == 1) {
message("called from the console")
} else {
message("called from elsewhere")
}
}
myfunc()
# called from the console
g <- function() myfunc()
g()
# called from elsewhere
不幸的是,这可能并不总是直观的:
ign <- lapply(1, myfunc)
# called from elsewhere
for (ign in 1) myfunc()
# called from the console
虽然lapply-family 和for 循环在很多方面是相似的,但它们在这里的行为是分开的。如果这是一个问题,也许缓解这种情况的唯一方法是分析/解析调用堆栈,并且可能“忽略”某些函数。如果这是您需要,那么也许这更合适:
R How to check that a custom function is called within a specific function from a certain package
【讨论】: