【问题标题】:how to reorder the search path?如何重新排序搜索路径?
【发布时间】:2019-03-24 08:46:38
【问题描述】:

我想将环境(包或其他)附加到位置 2,并且我希望它留在那里。

我可以在大多数情况下使用librarypos=3 来确保这一点,但我对tidyverse 有疑问:

search()
# [1] ".GlobalEnv"        "tools:rstudio"     "package:stats"    
# [4] "package:graphics"  "package:grDevices" "package:utils"    
# [7] "package:datasets"  "package:methods"   "Autoloads"        
# [10] "package:base" 

something <- list()
attach(something)
library(tidyverse,pos = 3)
search()
# [1] ".GlobalEnv"        "package:forcats"   "package:stringr"  
# [4] "package:dplyr"     "package:purrr"     "package:readr"    
# [7] "package:tidyr"     "package:tibble"    "package:ggplot2"  
# [10] "something"         "package:tidyverse" "tools:rstudio"    
# [13] "package:stats"     "package:graphics"  "package:grDevices"
# [16] "package:utils"     "package:datasets"  "package:methods"  
# [19] "Autoloads"         "package:base" 

tidyverse 将其子包附加到pos = 2,我想要一个search 路径以:

search()
# [1] ".GlobalEnv" "something" "package:forcats"...

我怎样才能做到这一点?

【问题讨论】:

    标签: r tidyverse r-environment


    【解决方案1】:

    我可以通过定义 2 个自定义函数来解决它,move_pkg_env 移动 package:* 环境,move_env(使用 move_pkg_env)移动搜索路径中的任何环境,只要只有 package:* 环境在它的位置和目的地之间:

    这里是如何使用它:

    something <- list()
    attach(something)
    library(tidyverse,pos = 3)
    
    search()
    # [1] ".GlobalEnv"        "package:forcats"   "package:stringr"  
    # [4] "package:dplyr"     "package:purrr"     "package:readr"    
    # [7] "package:tidyr"     "package:tibble"    "package:ggplot2"  
    # [10] "something"         "package:tidyverse" "tools:rstudio"    
    # [13] "package:stats"     "package:graphics"  "package:grDevices"
    # [16] "package:utils"     "package:datasets"  "package:methods"  
    # [19] "Autoloads"         "package:base"
    
    move_env("something", 2)
    
    search()
    # [1] ".GlobalEnv"        "something"         "package:forcats"  
    # [4] "package:stringr"   "package:dplyr"     "package:purrr"    
    # [7] "package:readr"     "package:tidyr"     "package:tibble"   
    # [10] "package:ggplot2"   "package:tidyverse" "tools:rstudio"    
    # [13] "package:stats"     "package:graphics"  "package:grDevices"
    # [16] "package:utils"     "package:datasets"  "package:methods"  
    # [19] "Autoloads"         "package:base" 
    

    功能:

    move_pkg_env <- function(env, at, after = FALSE){
      if(is.numeric(env)) env <- search()[env]
      if(!startsWith(env, "package:"))
        stop("env must be a 'package::*' environment")
      if(!env %in% search())
        stop(paste(env,"is not on the search path"))
    
      pkg <- sub('package:','',env)
      pos <- which(env == search())[1]
      if(is.character(at)){
        at = which(at == search())[1]
        if(is.na(at)) stop(paste(pkg,"is not on the search path"))
      }
      detach(env,character.only = TRUE)
      at <- at + after - (pos < at)
      suppressWarnings(library(pkg,pos=at,
                               warn.conflicts = FALSE, 
                               quietly = TRUE,
                               character.only = TRUE,
                               verbose = FALSE))
    }
    
    move_env <- function(env, at, after = FALSE){
      if(is.numeric(env)) env <- search()[env]
      if(!env %in% search())
        stop(paste(env,"is not on the search path"))
    
      if(is.character(at)){
        at = which(at == search())[1]
        if(is.na(at)) stop(paste(pkg,"is not on the search path"))
      }
      at <- at + after
    
      pos <- which(env == search())[1]
      while(pos > at){
        move_pkg_env(pos-1,pos+1)
        pos <- which(env == search())[1] 
      }
      while(pos < at){
        move_pkg_env(pos+1,pos-1)
        pos <- which(env == search())[1] 
      }
    }
    

    相关 github 问题

    https://github.com/tidyverse/tidyverse/issues/159

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      相关资源
      最近更新 更多