R语言从GitHub安装包:Rtools配置、GITHUB_PAT与避坑指南
简介面向R语言使用者的一份小体积代码包聚焦从GitHub安装R包的三种典型方式通过devtools在线安装、离线下载zip后install_local安装以及复制已有library目录快速迁移。内容以安装Achilles包为例兼顾Windows环境下的JDK准备与R环境变量配置适合数据科学家、统计分析和开发人员按需选用。压缩包共4个文件涵盖Markdown说明文档、HTML查看页面、inscode代码演示文件与.gitignore配置整体仅5KB便于快速下载查阅。已有209人学习下载。资源将三种方法拆解成可直接跟做的步骤包含具体函数用法、安装库路径指定方式、异地同步注意事项及参考资料链接HTML页面可离线浏览md文档适合对照操作inscode为代码脚本结构简洁能帮助初学者快速掌握GitHub包安装技巧也方便有经验者在无网络或版本锁定场景下灵活处理。1. R 语言安装 GitHub 包开发版、修复版与还没进 CRAN 的包第一次敲install_github()的人多半以为这和install.packages()只是换个地址的事。随后一串红色报错会让你明白从 GitHub 装 R 包真正卡人的不是网络而是本地编译工具链、认证配置和依赖版本这三道坎。这篇文章就把这三道坎逐一拆开。R 生态里 CRAN 是正式渠道但大量活跃开发的包不会第一时间进 CRAN。有的还处于开发版阶段有的作者把 bug 修复补丁放在 GitHub 上还有一批教学和实验性质的包只发布 GitHub。所以装 GitHub 包不是少数人的操作而是每个用开发版特性、复现他人实验、给团队搭环境的 R 使用者都要掌握的基本功。适合读这篇的人有四种需要开发版新功能的、被 CRAN 老版本坑过想试修复版的、要写团队安装脚本的、以及所有在install_github()上报过错却没搞清楚原因的人。下面从装前准备一路写到排错命令均可直接复制。2. 装前准备Rtools 版本、加载顺序与 GITHUB_PAT 配置2.1 为什么选 devtools / remotes而不是手动 git clone手动git clone后还要自己build、处理依赖、设库路径等于重复造轮子而且最容易漏掉“依赖本身也在 GitHub 上”这个前提。install_github()能自动解析包描述文件里的依赖并依次安装这部分手动做非常容易出错。devtools是标准的封装入口remotes是更轻量的实现两者在install_github()的用法上几乎一致。区别在于devtools会连带装上开发辅助功能对只想装包的人来说体积偏大remotes只做安装这一件事依赖更少下载时间更短。我一般在交互式开发时用devtools在写团队部署脚本时用remotes两者并存也没有冲突。# 检查本机是否已装 remotes / devtools没有则从 CRAN 装 if (!requireNamespace(remotes, quietly TRUE)) { install.packages(remotes) } if (!requireNamespace(devtools, quietly TRUE)) { install.packages(devtools) } # 用 remotes 读取 GitHub 上某个包的描述信息确认作者/仓库名无误 remotes::parse_github_repo(username/package_name)parse_github_repo()这个函数平时容易被忽略它的作用是把username/package_name解析成完整仓库地址如果用户名或仓库名拼写错误会提前暴露而不是等到安装中途才报错。对新手来说先跑这一句能省下大量排查时间。确认输出里仓库 URL 符合预期再往下走。2.2 先打通本地编译链Rtools 安装与 PATH 检查GitHub 上的包大多以源码形式发布Windows 上没有现成的二进制包必须在本机编译 C/C/Fortran 代码Rtools 就是这套编译工具链。没有它安装任何含原生代码的包都会在编译阶段失败报错信息里一定有compilation failed字样。macOS 和 Linux 通常不需要单独装工具链但 Linux 常有系统级依赖要先用apt装好这个放到第 4 章再展开。Rtools 的版本必须与你的 R 主版本对应不是越新越好。安装时安装器会询问是否加入 PATH这一步务必勾选因为install_github()在编译时需要能在命令行里直接找到编译器。如果当初没勾选安装完 Rtools 后未必生效需要手动配置 PATH。# 检查 Rtools 是否已经出现在 PATH 中 writeLines(Sys.getenv(PATH)) # 更可靠的判断让 pkgbuild 告诉我们工具链是否可用 if (!requireNamespace(pkgbuild, quietly TRUE)) { install.packages(pkgbuild) } pkgbuild::has_build_tools()pkgbuild::has_build_tools()返回TRUE说明编译链已就绪可以放心装源码包返回FALSE则优先排查 PATH 配置。在 Windows 上还有一种常见情况RStudio 重启后 PATH 才刷新所以在改完环境变量后建议把 RStudio 完全退出再打开不要只关窗口。2.3 配置 GitHub 认证GITHUB_PAT 与访问限额GitHub 的匿名 API 请求限额很低频繁访问仓库元数据很快就会超限。超限后install_github()会报403或者API rate limit exceeded。同时私有仓库必须认证才能访问。解决方式是一个 Personal Access Token写进环境变量GITHUB_PAT。# 打开 .Renviron 文件用于写入 GITHUB_PAT usethis::edit_r_environ()在打开的.Renviron中新增一行GITHUB_PATghp_你的令牌内容保存后必须重启 R 会话或者在当前会话手动执行readRenviron(~/.Renviron)立即加载。注意令牌不要加引号也不要让编辑器把引号变成中文全角引号否则解析会出问题这类问题非常隐蔽。注意GITHUB_PAT是访问令牌不是密码。泄露后可以在 GitHub 设置里随时吊销并重新生成无需修改真实账号密码。配置完成后可以用Sys.getenv(GITHUB_PAT)验证环境变量是否已生效返回值应该是完整的ghp_开头字符串。这一步看似繁琐实际上是后面所有安装稳定性的基础值得花两分钟做扎实。3. 主力命令 install_github最小可用命令与必调参数3.1 最小可用从 install.packages 到 install_github 的一次跳跃最基础的用法只有一行指定作者名和仓库名用斜杠连接不需要带仓库地址前缀也不需要.git后缀。# 最小可用命令从 GitHub 默认分支安装 remotes::install_github(username/package_name)install_github()会自动解析该包描述文件里声明的依赖并依次安装所以第一次运行时前置输出会很长看起来像是在装别的包这不是出错是依赖正在被处理。默认情况下装的是仓库默认分支的当前快照也就是说没有指定版本时这次安装和三个月后那次安装拿到的代码可能完全不同。# 完整示例装一个虚构包并让依赖也一并升级 remotes::install_github( repo somedev/simpledemo, dependencies TRUE, upgrade always )repo参数用作者名/仓库名的格式这是 GitHub 仓库的唯一标识。dependencies TRUE表示连同所有依赖一起装upgrade always表示如果依赖已有更新版本就顺手升级。对第一次跑通流程的人来说这个参数组合成功率最高代价是时间更长。装完后直接library(simpledemo)验证加载是否正常。3.2 必调参数ref、subdir、dependencies、upgrade、auth_token、force真实项目里光靠最小命令远远不够。下面这张表列出我最常调的 6 个参数每个背后都对应一个真实翻车场景。参数作用典型使用场景ref指定分支、标签或提交哈希锁定开发分支或回退到某个稳定 tagsubdir仓库子目录仓库里同时放了多个 R 包时指定包所在目录dependencies是否安装依赖想快速试装时设FALSE正常使用保持TRUEupgrade是否升级已装依赖防止装新包时把旧包环境破坏设neverauth_token认证令牌私有仓库或匿名 API 超限时使用force强制重新安装已装同版本包但文件损坏时使用# 带关键参数的一次完整安装 remotes::install_github( repo somedev/simpledemo, ref v0.3.1, # 锁定到 v0.3.1 这个 tag subdir r-package, # 包实际位于仓库的 r-package 子目录 dependencies TRUE, # 装依赖 upgrade never, # 不升级已安装的其他包 auth_token Sys.getenv(GITHUB_PAT), # 走认证避免限额 force TRUE # 即使同版本也强制重装 )ref的取值可以是分支名、tag 或完整 commit 哈希。分支名适合跟踪活跃开发tag 适合锁定稳定版commit 哈希则能精确复现某次实验状态。subdir只有在大型 monorepo 仓库里才用得到包和文档、数据、示例代码放在一起时必须告诉安装器包在哪一层目录。force TRUE的应用场景是本地包文件损坏但版本号没变不强制重装的话安装器会认为包已存在而跳过。3.3 改不动默认参数时直接绕过 devtools 调 remotes有时你装了devtools但它自带的install_github()因为版本较老某些参数不认。这种情况不用去升级devtools直接调remotes即可两者的install_github()接口几乎一致。# 老版本 devtools 不认新参数时直接用 remotes library(remotes) install_github( repo somedev/simpledemo, ref development, upgrade never )还有一个容易忽视的场景默认安装位置没有写权限。公司电脑或共享服务器上R_LIBS通常被管理员锁死这时候可以把包装到用户自己的目录里再把这个目录加入库路径。# 安装到用户级目录避开系统目录权限问题 my_lib - ~/R/my-library dir.create(my_lib, showWarnings FALSE, recursive TRUE) .libPaths(c(my_lib, .libPaths())) remotes::install_github(somedev/simpledemo)不少人在服务器上因为cannot create lock directory报错就放弃了其实只是当前用户没有系统库的写权限把库路径切到用户目录后问题直接消失。需要注意的是.libPaths()的追加顺序把用户目录放在最前面后续library()加载时才会优先命中自己装的版本。4. 安装避坑从依赖报错到本地编译失败的 5 条常见问题4.1 现象cannot open URL或连接超时安装进行到一半报错信息里有cannot open URL、Timeout或Could not resolve host字样。原因一般有两个一是网络环境对 GitHub 连接不稳定这是比较常见的状况二是匿名 API 限额触顶请求被 GitHub 拒绝。区分方法很简单如果之前装过别的 GitHub 包且成功最近没有加装更多包那大概率不是限额问题而是网络问题。解决先原命令重试一次很多时候第二次就能跑完GitHub 连接的偶发超时就是这么玄学。如果重试无效确认Sys.getenv(GITHUB_PAT)是否已配置有认证额度会高很多。同时排查防火墙或公司网络策略是否拦截了github.com与codeload.github.com两个域名。# 检查匿名限额是否已触顶 # 返回内容里能看到 remaining 数值 httr::GET(https://api.github.com/rate_limit)如果在输出里看到rate limit exceeded等一小时或配置 PAT 后再继续。需要说明的是这条经验在各类网络质量不尽相同的地区都适用属于常态化的现象而不要归结到任何特定因素上。4.2 现象Rtools 装了仍然报compilation failedRtools 明明装了install_github()却在中途报compilation failed for package xxx。这可能是 R 包源码中的 C/C 代码找不到编译器检查的却是正确路径。原因分两类一是 Rtools 没写入 PATH装了等于没装二是 Rtools 版本与 R 主版本不匹配编译器版本太旧不认新的源码语法。解决用pkgbuild::has_build_tools()重新检查返回FALSE就去翻 PATH。R 和 Rtools 的版本对应关系不强求写进脚本里但安装前到 Rtools 官网看版本说明这一步不能省。特别注意RStudio 在会话期间不会自动刷新 PATH修改后必须全退出再打开。# 在 R 会话里确认编译器路径是否正确 system(where gcc) system(where g)如果where gcc找不到编译器就是 PATH 问题找到但版本与 R 不匹配就卸载后重装对应版本。这条经验的血泪之处在于很多人反复卸载重装 Rtools但忘了先看 PATH白折腾半小时。4.3 现象私有仓库 404 或认证失败命令行报Authentication failed、Repository not found但仓库地址在浏览器里明明能打开。原因install_github()默认没有带认证信息或者带了的令牌没有私有仓库的访问权限。私有仓库就是私有仓库匿名访问必然 404这个 404 不是仓库不存在是权限不够。解决确认令牌类型是 fine-grained token 且勾选了Contents: Read权限检查令牌是否写到了.Renviron里并对应当前用户最后确认当前进程能读取到这个环境变量。# 确认令牌是否完整可见末尾字符是否正常 substr(Sys.getenv(GITHUB_PAT), 1, 10)GITHUB_PAT如果返回空字符串说明.Renviron没生效重启 R 会话再试。如果返回了字符串但安装仍报 404令牌权限面太小去 GitHub 设置里把权限加上。另外提醒一点旧令牌过期是常见翻车点回退查看就发现是过期了。4.4 现象装完一个包另一个包跑不起来了刚才还好好的环境装完新包后旧代码突然报函数找不到或者 namespace 冲突。原因upgrade参数的默认行为把依赖里的包升级到了最新版本而最新版本可能改了接口与其他包不兼容。解决对稳定性敏感的环境把upgrade设成never。团队协作场景建议用renv把项目依赖快照记录下来谁来装都是同一套版本。# 项目根目录启用 renv锁定依赖版本 renv::init() renv::snapshot()renv::snapshot()会生成锁文件之后任何人用renv::restore()都能还原到这个状态。这个后悔药一开始就吃最好等环境乱了再补就晚了。单独装包时的临时办法是降级到安装前依赖的版本但每次手工降级显然不是长久之计。4.5 现象ERROR: dependency xxx is not available安装过程中报dependency somepkg is not available for package target然后整个安装流程中断。原因依赖包不在 CRAN 上或者在 GitHub 上但没被自动解析出来。有些包依赖其他 GitHub 包而安装器在递归解析时对私有仓库或特殊分支处理不好。解决思路先确认somepkg是否存在于 CRAN搜不到就去 GitHub 上找这个依赖包的仓库地址手动先装依赖再装目标包。# 先装依赖再装目标包 remotes::install_github(someauthor/somepkg, upgrade never) remotes::install_github(somedev/simpledemo, upgrade never)手动先把依赖装掉再回来装目标包时解析器会发现依赖已满足直接跳过。这种问题在 monorepo 多包仓库中特别常见往往需要先装子目录里的基础包再装上层包。如果依赖包名称拼写有误那parse_github_repo()会立刻给出提示不要跳过这一步。5. 进阶技巧锁版本、私有仓库与团队安装脚本5.1 锁版本经过崩溃之后学会用 ref某仓库某天的更新与现有代码不兼容最稳妥的办法是把包锁在一个已知能用的状态。ref参数可以直接接 tag 或提交哈希。# 回退到某个稳定 tag remotes::install_github(somedev/simpledemov1.2.0) # 或者更精确锁到某次提交 remotes::install_github( repo somedev/simpledemo, ref e9a4b2c1d0f3a6b8c9d0e1f2a3b4c5d6e7f8a9b0 )注意写法是语法糖等价于ref参数。用提交哈希锁定是最可靠的因为 tag 可以被维护者移动或删除commit 一旦生成不可变。如果碰上已经删除 tag 的情况只能靠哈希。5.2 私有仓库团队安装脚本的正确写法团队内部分享的私有包需要每个成员都有令牌但令牌不能写进脚本提交到仓库。常见做法是从环境变量读取。#!/usr/bin/env bash # 团队脚本读取环境变量不硬编码令牌 echo Rscript -e remotes::install_github( \company/privatepkg\, auth_token Sys.getenv(\GITHUB_PAT\) ) | bash更好的做法是配合renv。在项目里先手动装好所有包renv::snapshot()生成锁文件队友克隆后执行renv::restore()就能得到完全一致的环境。锁文件会记录包来源包括 GitHub 仓库地址和 commit 哈希但不包含令牌令牌仍然各自配置各自的。5.3 装完怎么验证不加载一次不算装完安装输出里出现DONE不代表能正常使用。验证三件事能否加载、版本是否正确、核心功能是否可跑。# 验证加载与版本 library(simpledemo) packageVersion(simpledemo) # 跑一个包内置的示例确认函数可执行 example(main_function, package simpledemo)example()返回值不一定需要捕捉输出不报错即可。如果这个包没有示例数据就自己构造最小输入跑一遍核心函数。我有次装了某大体量包加载和版本都对一调用函数就报符号未定义最终确认是依赖库里混进了旧版本。所以验证的第三步最关键回归一次真实调用场景比任何安装日志都可信。最后说一个个人习惯凡是 GitHub 上装的包我会在项目里的一个文本文件中记录仓库名、commit 哈希和安装日期。环境出问题时这个清单就是后悔药不用靠记忆找回到底装的哪一版。安装 GitHub 包这件事前置堵死、参数看清、坑位记住之后真的可以一路畅通。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

pytest接口自动化进阶:fixture、参数化与断言实战

pytest接口自动化进阶:fixture、参数化与断言实战

1. 为什么pytest能成为接口自动化测试的首选框架做接口测试的人应该都有一个感受:刚开始用Python写接口用例时,最顺手的就是requests库发请求、断言返回值,但写着写着就发现代码越来越乱。同一个接口要测十几种参数组合,每个用例都…

2026/10/18 16:52:46 阅读更多 →
Jmeter接口测试与性能测试实战:从脚本到压测报告

Jmeter接口测试与性能测试实战:从脚本到压测报告

做了七八年的接口测试和性能测试,Jmeter是我电脑里装了最久、卸载次数最少的一个工具。早些年是配合自动化框架做接口回归,后来被拉去支撑性能测试,发现团队里会写脚本的多,能把线程数、Ramp-Up、断言、关联这些参数搭配明白的少。…

2026/10/18 16:52:46 阅读更多 →
UI自动化维护难?POM页面对象模型实战指南

UI自动化维护难?POM页面对象模型实战指南

做了几年UI自动化的人,大概率都经历过这个阶段:脚本越写越多,维护成本越来越高,每次前端改版都像抽签,不知道哪些用例会挂。我之前带过一个项目,登录按钮的ID从login_btn改成了submit_btn,全仓库…

2026/10/18 16:52:46 阅读更多 →

最新新闻

雪球网爬虫逆向实战:从抓包定位到签名算法复现

雪球网爬虫逆向实战:从抓包定位到签名算法复现

简介:面向逆向工程与安全研究初学者的雪球网数据接口逆向源码包,聚焦md5__1038参数生成逻辑,并对盼之代售、阿里v2滑动逆向等常见防护协议给出接口分析思路,内容仅供学习交流,抓包数据与敏感地址均已脱敏。压缩包共3个…

2026/10/18 18:25:57 阅读更多 →
Qwen3.8-27B 量化实战:16GB 显存跑 Q4,MLX-LM 配置与显存占用验证

Qwen3.8-27B 量化实战:16GB 显存跑 Q4,MLX-LM 配置与显存占用验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 18:25:57 阅读更多 →
Reflector 7.4.1.179 绿色版:集成 FileDisassembler 与 FileGenerator 的 .NET 反编译实践

Reflector 7.4.1.179 绿色版:集成 FileDisassembler 与 FileGenerator 的 .NET 反编译实践

简介:这是一份面向.NET开发者的反编译工具整合包,主角是经典的.NET Reflector 7.4.1.179绿色注册版,并真正集成了FileDisassembler与FileGenerator两款广受好评的插件,解决了原版只能逐个查看方法、无法批量导出源码的痛点。包内共…

2026/10/18 18:25:57 阅读更多 →
DASCTF2021 MISC赛题复盘:编码隐写与流量取证核心技巧

DASCTF2021 MISC赛题复盘:编码隐写与流量取证核心技巧

1. 赛题整体复盘与设计思路拆解打CTF比赛有个很反直觉的地方:比赛当时做出来的题,过两周再回头看,往往会有完全不同的理解。DASCTF2021这场MISC方向的题目就是典型例子,当时在赛场上被各种编码套娃和文件结构绕得头晕,…

2026/10/18 18:25:57 阅读更多 →
Claude Code CLAUDE.md 用户指令覆盖层全解析:AI Agent 记忆系统、上下文工程、规则分层、团队协作与安全治理

Claude Code CLAUDE.md 用户指令覆盖层全解析:AI Agent 记忆系统、上下文工程、规则分层、团队协作与安全治理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 18:25:57 阅读更多 →
Kyber实战指南:从格密码原理到后量子密钥封装与迁移

Kyber实战指南:从格密码原理到后量子密钥封装与迁移

如果你最近在评估加密组件,大概率已经注意到 Kyber 这个名字频繁出现。它是一种基于格的量子安全加密机制,核心能力是密钥封装(KEM),也就是让通信双方各自拿到一份相同的共享密钥,再用这份密钥去驱动后续的…

2026/10/18 18:24:57 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →