3

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

大多数时候我可以使用librarywith来确保这一点,但我遇到了以下问题:pos=3tidyverse

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"...

我怎样才能做到这一点?

4

1 回答 1

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

于 2018-10-19T14:28:58.323 回答