我想将一个环境(包或其他)附加到位置 2,并且我希望它保留在那里。
大多数时候我可以使用 library
和 pos=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 问题
关于r - 如何重新排序搜索路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52892704/