代码之家  ›  专栏  ›  技术社区  ›  Hector Haffenden

在一个函数之外加载包

r
  •  1
  • Hector Haffenden  · 技术社区  · 7 年前

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

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

    具体的问题是在mass和tidyverse包中使用select()函数,但我希望有一个更通用的解决方案。

    谢谢您。

    2 回复  |  直到 7 年前
        1
  •  4
  •   Roman    7 年前

    有三种很好的方法,在困难中崛起:

    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

    三。 modules

    它为您提供了一种python风格的导入模块(以r源文件的形式编写)和库的方法,并提供了一种更具内聚性的方式。好(但高级)的地方是,如果模块有子组,则可以部分加载,例如。 str = import('tools/strings') . 但是,这对包不起作用,因为它们是作为整体来编写的。模块在编码指南方面有一些优势,但会迫使您编写:

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

    modules on Github

        2
  •  1
  •   moodymudskipper    7 年前

    如果你这样做了 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:”开头的名称是为库保留的,不应 最终用户使用。