如何查找特定功能是否在另一个功能中使用

纳撒纳·伊斯特伍德

我希望能够找到.Deprecated某个功能是否正在使用该功能,例如my.fun举个例子:

my.fun <- function (...) {
  .Deprecated("my_fun")
  my_fun(...)
}

目前我正在使用

grepl(".Deprecated", as.character(body(getFromNamespace("my.fun", "mypackage"))))

效果很好,在上面的示例中它返回

[1] FALSE  TRUE  FALSE

但是,如果我.Deprecated在一个函数中将单词作为一个简单的字符串,则也会被选中。我知道mvbutils::foodweb()mvbutils::calleer.of()函数,但只有在我明确定义自己的.Deprecated函数时,它们才起作用有没有人知道一种仅搜索函数而不是字符串的优雅方法?

康拉德·鲁道夫(Konrad Rudolph)

一个健壮的解决方案必须检查函数体语法而不是进行字符串搜索幸运的是,R使这个相对容易:

variables = all.names(body(myfunction))
'.Deprecated' %in% variables

需要注意的是,这并不能检验是否.Deprecated真正指代base::.Deprecated; 上面将显示将符号用作变量/函数名称的任何用法。但是,通常只有在不实际执行该功能的情况下,才能找到符号所指的功能,因此,这与所获得的效果一样好,而无需执行所有功能并跟踪其功能调用。

最好的办法是获取函数中使用的名称列表,并在定义函数的上下文中获取其定义。这可以看作是一种好的启发式方法:如果函数使用.Deprecated,并且在定义函数的上下文中定义了该符号,则将产生正确的定义。但是,例如在以下情况下将失败:

  • 假阳性:

    f1 = function () {
        .Deprecated = 42
    }
    
  • 假阴性:

    f2 = function () {
        x = get('.Deprecated', mode = 'function')
        x("f1")
    }
    

因此,请谨慎使用。

calls_function = function (f, target, target_name = deparse(substitute(target_name))) {
    find_definition = function (candidates)
        mget(candidates, environment(target), mode = 'function')

    resolves_to_target = function (candidates)
        sapply(find_definition(candidates), identical, target)

    variables = unique(all.names(body(f)))
    candidates = grep(target_name, variables, fixed = TRUE)
    length(candidates) > 0 && any(resolves_to_target(variables[candidates]))
}

用法:

calls_function(f1, .Deprecated)

请注意,函数名称作为不带引号的参数传递如果要传递base::.Deprecated,还需要提供“ unqualified”名称作为第三个参数:

calls_function(f1, base::.Deprecated, '.Deprecated')

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何查找特定功能是否正在另一个功能中使用

来自分类Dev

如何监视另一个功能中使用的功能?

来自分类Dev

如何在另一个功能中使用来自一个功能的数据?

来自分类Dev

在定义第一个功能之前,在另一个功能中使用一个功能

来自分类Dev

如何在g ++中使用另一个文件中定义的功能?

来自分类Dev

如何在另一个类中使用扩展功能?C#

来自分类Dev

如何在angularjs的另一个工厂中使用模块功能

来自分类Dev

如何停止使用另一个功能

来自分类Dev

如何定义输出另一个功能的功能?

来自分类Dev

在一个功能中使用在另一个功能中定义的列表。Python 2.7

来自分类Dev

根据O标记如何判断一个功能是否比另一个功能快?

来自分类Dev

使用javascript测试是否单击/触发了一个功能,然后禁用了另一个功能。

来自分类Dev

llvm:如何使用llvm api将功能A替换为另一个功能?

来自分类Dev

是否可以从另一个功能“返回”一个功能?

来自分类Dev

是否可以在另一个功能中具有一个功能

来自分类Dev

如何在另一个功能中使用在QDateEdit小部件中设置的用户值?

来自分类Dev

在解决方案中使用另一个项目的功能

来自分类Dev

Openpyxl-在另一个文件中使用导入的功能

来自分类Dev

在另一个任务中使用Gradle任务功能

来自分类Dev

如何将一个功能整合到另一个功能中?

来自分类Dev

如何在执行另一个功能时执行一个功能?

来自分类Dev

如何从一个功能获得价值到另一个功能?

来自分类Dev

从一个功能到另一个功能使用信息

来自分类Dev

如何内联另一个翻译单元的功能?

来自分类Dev

如何从另一个类访问功能

来自分类Dev

使用另一个cpp文件的功能

来自分类Dev

另一个功能对ofstream的基本使用

来自分类Dev

我可以在另一个任务中使用一个PowerShell任务中的功能吗?

来自分类Dev

如何在另一个自定义模块中使用一个自定义模块中的功能

Related 相关文章

  1. 1

    如何查找特定功能是否正在另一个功能中使用

  2. 2

    如何监视另一个功能中使用的功能?

  3. 3

    如何在另一个功能中使用来自一个功能的数据?

  4. 4

    在定义第一个功能之前,在另一个功能中使用一个功能

  5. 5

    如何在g ++中使用另一个文件中定义的功能?

  6. 6

    如何在另一个类中使用扩展功能?C#

  7. 7

    如何在angularjs的另一个工厂中使用模块功能

  8. 8

    如何停止使用另一个功能

  9. 9

    如何定义输出另一个功能的功能?

  10. 10

    在一个功能中使用在另一个功能中定义的列表。Python 2.7

  11. 11

    根据O标记如何判断一个功能是否比另一个功能快?

  12. 12

    使用javascript测试是否单击/触发了一个功能,然后禁用了另一个功能。

  13. 13

    llvm:如何使用llvm api将功能A替换为另一个功能?

  14. 14

    是否可以从另一个功能“返回”一个功能?

  15. 15

    是否可以在另一个功能中具有一个功能

  16. 16

    如何在另一个功能中使用在QDateEdit小部件中设置的用户值?

  17. 17

    在解决方案中使用另一个项目的功能

  18. 18

    Openpyxl-在另一个文件中使用导入的功能

  19. 19

    在另一个任务中使用Gradle任务功能

  20. 20

    如何将一个功能整合到另一个功能中?

  21. 21

    如何在执行另一个功能时执行一个功能?

  22. 22

    如何从一个功能获得价值到另一个功能?

  23. 23

    从一个功能到另一个功能使用信息

  24. 24

    如何内联另一个翻译单元的功能?

  25. 25

    如何从另一个类访问功能

  26. 26

    使用另一个cpp文件的功能

  27. 27

    另一个功能对ofstream的基本使用

  28. 28

    我可以在另一个任务中使用一个PowerShell任务中的功能吗?

  29. 29

    如何在另一个自定义模块中使用一个自定义模块中的功能

热门标签

归档