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。