【问题标题】:Choose function to load from an R package选择要从 R 包中加载的函数
【发布时间】:2015-04-30 07:21:04
【问题描述】:

我喜欢使用matlab 包中的函数reshape,但是我需要在每次对矩阵的元素求和时指定base::sum(m),否则会调用matlab::sum,它只能按列求和..

我需要加载包gtools 来使用rdirichlet 函数,但是函数gtools::logit 掩盖了我更喜欢的函数pracma::logit..

我想没有这样的事情:

library(loadOnly = "rdirichlet", from = "gtools")

library(loadEverythingFrom = "matlab", except = "sum")

.. 因为 matlab 包中的函数可能在内部对 matlab::sum 函数起作用。所以后者必须被加载。但是有没有办法从用户的角度来获得这种行为呢?感觉是这样的:

library(pracma)
library(matlab)
library(gtools)
sum <- base::sum
logit <- pracma::logit

.. 但这不会破坏您的 ls() 与所有这些小实用功能?

也许我需要定义自己的默认命名空间?

【问题讨论】:

  • 对于两个名称冲突的包,在较高位置 library(..., pos = number) 加载的包将优先。您可以使用search() 查看包裹的位置。如果您要在低于gtools 的位置加载pracma,那么您的logit 应该是您想要的。我不知道如何解决base::sum 问题。我认为你最好只使用library::function 语法来调用你想要的函数。
  • @Vlo 太糟糕了。但是感谢pos 的技巧,这会有所帮助.. :)
  • 您可以在脚本顶部使用.Rprofile 文件和/或.onLoad() 函数来组织搜索路径
  • 请注意包'pracma'有一个Reshape函数,用大写字母避免与stats::reshape冲突。

标签: r function namespaces package rename


【解决方案1】:

据我所知,要实现的目标没有简单的答案。我能想到的唯一肮脏的黑客是下载包“matlab”、“gtools”、“pracma”的源代码,并在从源代码安装之前从它们的 NAMESPACE 文件中删除有问题的函数(使用 R CMD INSTALL 包)。

但是,我建议使用显式表示法 pracma::logit,因为它可以提高您的代码在未来对其他人和您自己的可读性。

这个网站很好地概述了包命名空间: http://r-pkgs.had.co.nz/namespace.html

【讨论】:

  • Yope,这个 hack 太脏了,而且对分享者不友好。但是感谢您的这个网站,我学到了很多东西!
【解决方案2】:

为避免破坏您的ls,您可以执行以下操作:

.ns <- new.env()
.ns$sum <- base::sum
.ns$logit <- pracma::logit
attach(.ns)

【讨论】:

  • 我不知道这是否是一个 hack,但我有点喜欢它。 ;) 我会先尝试更好地订购我的search(),然后再用你的技巧跪下......仅适用于我懒得使用::的情况。
猜你喜欢
  • 2019-04-09
  • 2013-08-03
  • 1970-01-01
  • 2016-08-28
  • 2017-01-05
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多