r - R 包的函数命名

标签 r function duplicates packages names

我正在编写一个 R 包,并且非常希望避免使用在其他包中找到的函数名称。例如,我计划调用一个函数 'annotate',但这已经在 NLP 包中使用了。显然最好避免明显的名称选择,但是是否有一种系统的方法来搜索 CRAN 发布的函数名称的详尽列表以避免重复?我明白这对于 CRAN 共享包来说很重要,但在本地共享时它也很重要,以防与另一个加载的包发生冲突。

最佳答案

当加载包含同名函数的两个包时,会发生名称冲突。因此,可以在两个地方避免名称冲突:

  • 在包中定义函数名时
  • 从包中调用函数时

  • 创建具有唯一名称的函数
    在撰写本文时(2017 年 8 月 23 日),CRAN 上提供了数量惊人的 11272 个包(最新数据可在 here 中找到),新包正在 added every day .
    因此,创建今天唯一的函数名称可能会在将来添加其他包时导致名称冲突。
    Alistaire already has mentioned为所有函数添加前缀的选项。除了stringistringr , forcats包是另一个使用前缀 fct_ 的例子。和 lvls_ .
    这种方法可以大大降低名称冲突的可能性。
    (虽然不能保证没有其他包维护者可能会选择相同的前缀。)
    使用双冒号运算符明确调用函数
    恕我直言,避免名称冲突的最终责任是用户的。
    我在这里看到了关于 SO 的问题,其中加载了六个以上的包。或者,library(tidyverse)被调用是为了方便,它正在加载 19 个其他包,其中 dplyrtidyr就足够了。
    大量加载的包使命名空间困惑会增加名称冲突的风险。即使只加载了两个包,也可能会发生名称冲突。例如,lubridatedata.table包都定义了
    hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year
    
    调用哪个函数将取决于加载包的顺序。 (您可以使用 conflicts() 来查找在搜索路径的两个或多个位置中存在的同名对象。)
    为避免歧义和意外结果,我建议加载尽可能少的包并使用双冒号运算符 ?"::"在不预先加载包的情况下从包中调用函数,例如,
    library(data.table)
    DT <- data.table(t = lubridate::now() + 0:3)
    # call function from loaded package data.table
    DT[, second(t)] 
    
    [1] 18 19 20 21
    
    # call function from lubridate package
    DT[, lubridate::second(t)]
    
    [1] 18.88337 19.88337 20.88337 21.88337
    

    使用双冒号运算符还有另一个好处。它将作为调用函数包的代码中的文档。
    这是以额外敲击一些按键为代价的,但在数周或数年后检查、修改或调试代码时可能会节省大量时间。我已经看到很多关于 OP 没有提到包的问题。

    关于r - R 包的函数命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45821410/

    相关文章:

    function - tensorflow 一数值输出

    python - Pandas :无法检测两列中的重复项

    c# ToDictionary with ContainsKey 检查

    r - 在R中转换形状坐标系

    按组计算的四舍五入平均值总和与组总数相同

    sql - 将查询分组为组和子组

    javascript - 从 JS 中的字符串中替换特定元素(唯一的或重复的)

    r - For 循环未正确索引 - 将 for 循环的结果放入矩阵中

    javascript - 如何访问symfony2中另一个html.twig文件中的javascript函数?

    c - 如何将一个数组的变量值赋给另一个变量?