06R 会话、工作区与包库

区分对象、已加载包与磁盘包库,并检查会话信息、library paths、CRAN 和 Bioconductor repositories。

2026-04-06
RWorkspacePackagesLibrary PathsEnvironmentsRepositories
本章目录 · 8

R 会话同时维护几类容易混淆的状态:当前环境中创建的对象、已经 attach 的包,以及磁盘上安装包的 library directories。ls()search().libPaths() 分别查看这三层状态。

问题 函数
当前环境里有哪些对象? ls()
当前 search path 上有哪些环境和包? search()
R 会去哪些目录查找已安装包? .libPaths()
磁盘上安装了哪些包? installed.packages()

理解这几层后,才能分清“对象不存在”“包未加载”和“包未安装”这三种不同错误。

ls():查看当前环境中的对象

x <- 1:5
model_name <- "linear"

ls()
# [1] "model_name" "x"

按名称模式筛选:

ls(pattern = "^model")

ls() 默认检查当前 environment。在全局交互会话中通常就是 .GlobalEnv

ls(envir = .GlobalEnv)

它只返回对象名,不展示对象结构。需要检查对象内容时,再使用 str()class()object.size()

objects <- ls()

data.frame(
  name = objects,
  size = vapply(
    objects,
    function(name) object.size(get(name, envir = .GlobalEnv)),
    numeric(1)
  )
)

rm():删除对象

删除已知对象:

rm(x, model_name)

对象名保存在字符向量中时,使用 list 参数:

temporary_objects <- c("temp_a", "temp_b")
rm(list = temporary_objects)

按名称模式删除前,先单独查看将被选中的对象:

targets <- ls(pattern = "^temp_")
targets

rm(list = targets)

rm(list = ls()) 会删除当前环境中的全部对象:

rm(list = ls())

它适合明确要重置的交互会话,但不应成为每个脚本开头的固定仪式。一个可复现脚本应在干净的新会话中仍能从输入重新创建结果,而不是依赖先清空调用者的 workspace。

删除 R 对象后,内存不一定立即返还给操作系统。必要时可以请求 garbage collection:

gc()

gc() 不是正常代码每一步都要调用的性能优化;通常只在移除大型对象并确实面临内存压力时考虑。

search():查看 search path

search()

结果通常包含 .GlobalEnv、已 attach 的 packages,以及其他环境。调用一个没有命名空间前缀的函数时,R 会沿 search path 查找名称,因此两个包导出同名函数时可能发生 masking。

library(dplyr)
search()

需要明确函数来源时,使用命名空间前缀:

dplyr::filter(data, condition)
stats::filter(x, filter)

search() 显示 attach 到查找路径的内容;loadedNamespaces() 显示已经加载的 namespaces。一个 namespace 可以因依赖关系被加载,却不一定 attach 到 search path。

loadedNamespaces()

.libPaths():查看包库路径

R package library 是磁盘上保存已安装包的目录。查看当前查找路径:

.libPaths()

R 会按返回顺序查找包。同一个包若出现在多个 library 中,路径顺序可能决定实际加载哪一份。

查看某个包来自哪里及其版本:

find.package("ggplot2")
packageVersion("ggplot2")

临时把自定义 library 放在当前会话查找路径最前面:

project_library <- "D:/R/project-library"

.libPaths(c(project_library, .libPaths()))

这只改变当前 R 会话查找包的位置,不会移动已有包,也不会自动创建目录:

dir.create(project_library, recursive = TRUE, showWarnings = FALSE)
.libPaths(c(project_library, .libPaths()))

长期项目若需要固定依赖版本,单独修改 .libPaths() 只解决“去哪里找”,不能完整记录“应该使用哪些版本”。这类需求通常应使用项目级依赖管理与 lockfile。

library():加载已经安装的包

library(ggplot2)

这会加载 package namespace,并把导出的对象 attach 到 search path。它不会安装缺失的包。

不提供包名时,library() 展示可用 library 中的已安装包:

library()

脚本只调用少量外部函数时,可以直接使用 pkg::fun(),让依赖来源留在代码中:

ggplot2::ggplot(data, ggplot2::aes(x, y))

检查包是否可用而不 attach:

requireNamespace("ggplot2", quietly = TRUE)

查看全部已安装包的结构化信息:

installed <- installed.packages()
installed[, c("Package", "Version", "LibPath")]

sessionInfo():记录运行环境

sessionInfo()

输出包含 R 版本、平台、操作系统、locale、attached packages 和已加载 namespaces 的版本。它适合:

  • 放在分析日志或报告末尾;
  • 复现问题时与错误消息一起提供;
  • 比较两台电脑或两个运行环境的差异;
  • 记录生成最终结果时实际使用的环境。

sessionInfo() 只描述当前会话,不是依赖锁定工具。它不会自动重建同一环境,也不会列出当前未加载但项目可能依赖的所有包。需要项目级复现时,应同时保留代码、输入版本和依赖 lockfile。

单独查看当前 R 版本:

R.version.string
R.Version()$version.string

配置 CRAN 与 Bioconductor repositories

查看当前 CRAN repository:

getOption("repos")

使用 Bioconductor 时查看完整 repositories:

BiocManager::repositories()

交互式选择:

chooseCRANmirror()
chooseBioCmirror()

也可以在当前会话直接设置:

options(
  repos = c(
    CRAN = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"
  )
)

options(
  BioC_mirror = "https://mirrors.westlake.edu.cn/bioconductor"
)

将选项写入用户或项目 .Rprofile 可以在启动时重复应用,但配置文件也会影响脚本运行环境。修改后应重新启动 R 并检查:

getOption("repos")
BiocManager::repositories()

下载失败不一定是镜像问题,也可能来自代理、证书、系统编译工具、R 与 package binary 不兼容,或 repository 中没有对应版本。不要在未确认原因时不断切换来源并混装包。

三类操作不要混用

操作 改变什么 不会改变什么
rm(x) 删除环境中的对象 不卸载或删除 package
library(pkg) attach 已安装包 不安装 package
.libPaths(...) 改变 package 查找目录 不移动、安装或更新 package
install.packages() 把 package 写入 library 不保证当前会话已 attach

遇到问题时,可以按顺序检查:

exists("my_object")
"package:dplyr" %in% search()
requireNamespace("dplyr", quietly = TRUE)
find.package("dplyr")
.libPaths()

这样可以快速判断缺少的是当前对象、attached package、installed package,还是正确的 library path。