【问题标题】:What exactly happens with library(<package>) when I source an R file当我获取 R 文件时, library(<package>) 究竟会发生什么
【发布时间】:2017-02-24 08:17:30
【问题描述】:

如果我有一个函数 fun() 需要另一个函数,例如,来自某个其他包(在本例中为 dplyr)的 select() 保存在 R 文件 helpfile.r 中,我想在另一个 R 文件中使用此函数 fun(),我可以简单地使用 source() 获取该函数

现在我注意到,当我在 helpfile.r 中使用 library(dplyr) 并在我的主文件中获取该文件时,会加载包,但是,所有与其他函数发生冲突的函数其他包被省略。就我而言:我已经加载了包 MASS,它还有一个 select() 函数,在我以这种方式加载 dplyr 后仍然“活动”。

问题当我通过source() 加载一个包时,为什么链中后面加载的包没有覆盖之前包中的函数? p>

【问题讨论】:

    标签: r namespaces package


    【解决方案1】:

    包按照加载顺序相互屏蔽。 source() 就像用CTRL+SHIFT+SCTRL+A 后跟CTRL+ENTER 执行整个文件。

    我建议您通过不加载整个包而是写出完整的命名空间来使您的 helpfile.r 更加独立,例如 dyplr::select()

    【讨论】:

    • 实际上,最好构建一个包。包基础结构允许更好地控制从包命名空间导入的内容。
    • 完全同意罗兰。然而,为了获得最佳性能而深入研究 R 会让你越来越成为一名软件工程师,而不仅仅是数据科学家。我是一名地理学家,有时只需要一个特定项目(也是一个 git 存储库)的 helperfile.r。在那种情况下,我跳过启动另一个(git)项目......对于这种情况,实际上source() 函数将一个文件构建为迷你包很酷:-)
    • AFAIK,除了 helperfile.r 之外,您只需要一个说明和一个命名空间文件即可拥有一个功能包。 (当然,您应该始终记录您的代码,并且使用 knitr 您可以轻松编写文档。)
    猜你喜欢
    • 2023-04-01
    • 2014-08-20
    • 2013-06-13
    • 1970-01-01
    • 2023-03-29
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多