【问题标题】:How to check if a function has been called from the console?如何检查是否已从控制台调用函数?
【发布时间】:2020-12-02 09:48:50
【问题描述】:

我正在尝试跟踪从控制台调用某些函数的次数。 我的计划是在每个函数中添加一个简单的函数,例如“trackFunction”,以检查它们是从控制台调用还是作为底层函数调用。

尽管这个问题听起来很简单,但由于我在函数编程方面的知识有限,我无法找到一个好的解决方案。我一直在查看调用堆栈和 rlang::trace_back 但没有一个好的解决方案。

感谢任何帮助。

谢谢

【问题讨论】:

    标签: r environment-variables


    【解决方案1】:

    一种简单的方法是查看当前帧位于哪个级别。也就是说,如果直接在解释器中调用函数,则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

    【讨论】:

    • 您好 r2evans,感谢您的详细回复。我所说的“从控制台调用”的意思是从那里调用的任何函数,即如果我运行 func1(func2(func3))) 那么我认为所有 3 个函数都是从控制台运行的。但是 sys.nframe() 将分别返回 1,2,3。进一步的问题是管道运算符,如果我执行 "arg1" %>% func1 %>% func2 %>% func3 我也认为它们是从控制台调用的,并且 sys.nframe() 更不可靠。所以我猜它必须来自对第一个环境的分析
    • 那么祝你好运。我唯一的想法是关注我的第二个链接,并扩大可接受的包/功能列表(因为您从控制台进行的许多调用都将具有一个或多个父/调用函数)。
    猜你喜欢
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2012-02-19
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多