【问题标题】:Load a package apart from one function除了一个函数加载一个包
【发布时间】:2019-03-27 01:51:32
【问题描述】:

我想加载除了一个函数之外的整个包。

我看到了解决方法,例如 How to load only specific functions from a package 但这并不能满足我的全部需求。

具体问题是在 MASS 和 tidyverse 包中加载 select() 函数,但我想要一个更通用的解决方案。

谢谢。

【问题讨论】:

  • 你不能只加载包命名空间的一部分。但是您可以在函数前面加上包名来消除歧义,即MASS::selectdplyr::select
  • 这是在包的上下文中还是只是一个脚本?如果是前者,您可以有选择地从包中导入函数,虽然遍历所有内容并显式导入它可能很乏味,但这样做是一种好习惯。如果是后者,我不相信这是可能的,所以你应该按照有意义的顺序加载包,然后每次你想使用该功能时明确使用MASS::select()

标签: r


【解决方案1】:

有三种不错的方法可以做到这一点,难度增加:

1。 conflicted

它会检查名称冲突,并会通过抛出错误来阻止您使用掩码或掩码函数。但是您可以声明一个会话范围的首选项,例如:

conflict_prefer("filter", "dplyr")
#> [conflicted] Will prefer dplyr::filter over any other package

conflicted on Github

2。 import

它允许您从包中显式导入特定功能(如果您愿意,可以给它们一个自定义名称)

import::from(ggplot2, g = ggplot, aes, geom_point)
g(iris, aes(Petal.Width, Petal.Length)) + geom_point()

import on Github

3。 modules

它为您提供了一种 Python 式的方式来导入模块(编写为 R 源文件)和库,并以一种更具凝聚力的方式。好的(但先进的)事情是模块,如果它们有子组,可以部分加载,例如str = import('tools/strings')。但是,这不适用于包,因为它们是作为整体编写的。 modules 在编码指南方面具有一些优势,但会迫使您编写:

dplyr = import_package('dplyr')
cars %>% dplyr$filter(speed > 15)

modules on Github

【讨论】:

    【解决方案2】:

    如果你这样做select <- MASS::select 你应该没问题。

    如果您真的不希望它出现在您的全局工作区中,您可以在附加 MASS(可选)和 dplyr 之后这样做:

    attach(list(select=MASS::select),name = "front_select")
    

    这样它会在其他人之前找到这个,因为环境front_select将在搜索路径中首先遇到。

    虽然这不是很正统。

    这是假设您希望它用于交互使用,如果不是绝对使用:: 表示法。


    实际上你所要求的是可能的,虽然它是很多黑色巫术,我觉得我会因此而被否决,但这回答了这个问题:

    library(dplyr)
    x <- as.list(as.environment("package:dplyr"))
    detach("package:dplyr")
    x$select <- NULL
    attach(x,name = "package:dplyr")
    mutate
    # function (.data, ...) 
    # {
    #     UseMethod("mutate")
    # }
    # <bytecode: 0x00000000190069c0>
    # <environment: namespace:dplyr>
    
    select
    # Error: object 'select' not found
    

    来自?search

    以“package:”开头的名称是为库保留的,不应该是 最终用户使用。

    【讨论】:

      猜你喜欢
      • 2021-06-30
      • 1970-01-01
      • 2011-12-31
      • 2013-05-23
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多