r - 如何重新排序搜索路径?

标签 r tidyverse r-environment

我想将一个环境(包或其他)附加到位置 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"...

我怎样才能实现这个目标?

最佳答案

我可以通过定义 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

关于r - 如何重新排序搜索路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52892704/

相关文章:

r - 我可以生成一个包含两个向量的表吗?

apache - 通过 RApache 安装 R Web 应用程序的最简单方法是什么?

r - 通过定界符将字符分隔成假定固定宽度的向量

r - 使用glue::glue时处理命名空间的更好方法

r - 如何检查环境是否是包命名空间

r - 使用 R 编程将用文字书写的数字转换为数字

r - 如何让 R 包推荐托管在 GitHub 上的包?

r - 使用 tidyverse 动词将以下函数翻译为基础 R 作为函数

r - 如何引用包含引用调用的表达式并取消引用其中的字符串?