gpt4 book ai didi

r - 通过以下方式调用包中的函数是一个好习惯吗:

转载 作者:行者123 更新时间:2023-12-03 07:19:27 26 4
gpt4 key购买 nike

我正在编写一些 R 函数,这些函数在 stringrbase64enc 等其他包中使用一些有用的函数。最好不要先调用 library(...)require(...) 来加载这些包,而是使用 ::直接引用我需要的函数,例如stringr::str_match(...)

在一般情况下这是一个好的做法吗?或者说可能会引发什么问题?

最佳答案

这一切都取决于上下文。

::如果存在命名空间冲突,即来自不同包的具有相同名称的函数,则这是主要必要的。当我加载dplyr时包,它提供了一个函数filter ,它与 filter 发生冲突(并掩盖)函数默认加载在stats中包裹。所以如果我想使用stats加载后函数的版本dplyr ,我需要用 stats::filter 来调用它.

这也为不加载大量包提供了动力。如果您确实只想要包中的一个功能,那么最好使用 ::而不是加载整个包,特别是如果您知道该包将屏蔽您想要使用的其他功能。

不是在代码中,而是在文本中,我确实找到了 ::很有用。输入 stats::filter 更加简洁比“filter 包中的 stats 函数”。

性能的角度来看,使用 :: 的代价(非常)小。 。长期 R-Core 开发团队成员 Martin Maechler 写道(在 r-devel mailing list (Sept 2017) 上)

Many people seem to forget that every use of :: is an Rfunction call and using it is inefficient compared to just usingthe already imported name.

性能损失非常小,约为几微秒,因此只有当您需要高度优化的代码时才需要担心。运行一行使用 :: 的代码一百万次将比不使用 :: 的代码多花费一两秒.

就可移植性而言,最好在脚本顶部显式加载包,因为这样可以轻松浏览前几行并了解需要哪些包,并在必要时安装它们,然后再深入了解任何内容否则,即在一个漫长的过程中进行了一半,而现在如果不重新开始就无法完成。

旁白:可以提出类似的论点来选择 library()超过require() 。如果包不存在,Library 将导致错误并停止,而 require 将发出警告但继续。如果您的代码有一个应急计划,以防包不存在,那么请务必使用 if (require(package)) ... ,但是如果您的代码在没有包的情况下会失败,您应该使用 library(package)位于顶部,因此它会尽早且明显地失败。

在您自己的包中

一般的解决方案是制作你自己的包 imports您需要在描述文件中使用的其他包。当您安装软件包时,这些软件包将自动安装,因此您可以使用 pkg::fun内部。或者,也将它们导入 NAMESPACE文件,您可以import整个包或选择性地importFrom具体功能并不需要:: 。对此,看法不一。 Martin Maechler(与上面相同的 r-devel 来源)说:

Personally I've got the impression that :: ismuch "overused" nowadays, notably in packages where I'd stronglyadvocate using importFrom() in NAMESPACE, so all this happensat package load time, and then not using :: in the packagesources itself.

另一方面,RStudio 首席科学家 Hadley Wickham 在他的 R Packages book 中说道:

It's common for packages to be listed in Imports in DESCRIPTION, but not in NAMESPACE. In fact, this is what I recommend: list the package in DESCRIPTION so that it’s installed, then always refer to it explicitly with pkg::fun(). Unless there is a strong reason not to, it's better to be explicit.

两位受人尊敬的 R 专家给出了相反的建议,我认为可以公平地说,您应该选择最适合您并满足您对清晰度、效率和可维护性的需求的风格。

<小时/>

如果您经常发现自己只使用另一个包中的一个函数,您可以复制代码并将其添加到您自己的包中。例如,我有一个供个人使用的包,借用 %nin%来自Hmisc包,因为我认为这是一个很棒的功能,但我不经常使用 Hmisc 中的其他内容。与roxygen2 ,很容易添加@author@references正确归属借用函数的代码。执行此操作时还要确保包许可证兼容。

关于r - 通过以下方式调用包中的函数是一个好习惯吗:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com