How to check if a function has been called from the console?

限于喜欢 提交于 2021-02-05 11:55:25

问题


I am trying to track the number of times certain functions are called from the console. My plan is to add a simple function such as "trackFunction" in each function that can check whether they have been called from the console or as underlying functions.

Even though the problem sounds straight-forward I can't find a good solution to this problem as my knowledge in function programming is limited. I've been looking at the call stack and rlang::trace_back but without a good solution to this.

Any help is appreciated.

Thanks


回答1:


A simple approach would be to see on which level the current frame lies. That is, if a function is called directly in the interpreter, then sys.nframe() returns 1, otherwise 2 or higher.

Relate:

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

Unfortunately, this may not always be intuitive:

ign <- lapply(1, myfunc)
# called from elsewhere
for (ign in 1) myfunc()
# called from the console

While for many things the lapply-family and for loops are similar, they behave separately here. If this is a problem, perhaps the only way to mitigate this is the analyze/parse the call stack and perhaps "ignore" certain functions. If this is what you need, then perhaps this is more appropriate:

R How to check that a custom function is called within a specific function from a certain package



来源:https://stackoverflow.com/questions/63380024/how-to-check-if-a-function-has-been-called-from-the-console

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!