R Markdown代码块运行异常:手动执行正常但Knitting时指定代码行无法运行
解决Rmd Knitting时
read_excel()和getwd()失效的问题 我来帮你排查这个手动运行正常但Knitting时部分代码失效的问题——这种情况大概率是工作目录不匹配或者文件路径逻辑搞混了,咱们一步步拆解解决:
1. 先搞清楚Knitting时的工作目录和你手动运行的区别
手动运行代码时,你的R会话用的是当前设置的工作目录(可以通过getwd()查看);但Knitting Rmd文件时,R会自动把工作目录切换到这个Rmd文件所在的文件夹。这就导致:你手动运行时能找到test_data.xlsx,但Knitting时,文件可能不在Rmd的目录下,自然读不到。
验证这个问题很简单:单独新建一个代码块放getwd(),然后执行Knitting,对比输出的路径和你手动运行getwd()得到的路径——如果不一样,那问题根源就在这。
2. 修正文件路径的两种实用方法
方法一:用基于Rmd文件的相对路径
如果test_data.xlsx和你的Rmd文件在同一个文件夹里,那直接写read_excel("test_data.xlsx")就行,但要确认文件真的在那里(有时候手动运行时工作目录是上层文件夹,你误以为文件和Rmd同目录,其实不是)。
如果文件在子文件夹里,比如Rmd在项目根目录,文件在data子文件夹,那路径要写成:
test <- read_excel("data/test_data.xlsx")
方法二:用绝对路径(临时排查专用,不推荐长期用)
直接写文件的完整路径,比如Windows系统:
test <- read_excel("C:/Users/你的用户名/Documents/test_data.xlsx")
Mac/Linux系统:
test <- read_excel("/Users/你的用户名/Documents/test_data.xlsx")
如果这样Knitting能成功,就完全坐实是路径问题了。
进阶推荐:用here包管理路径(项目级最佳实践)
here包会自动识别你的R项目根目录,不管你在哪里Knitting,路径都不会出错,非常适合规范的项目管理:
# 先安装并加载here包 if (!require(here)) install.packages("here") library(here) # 用here()指定文件路径,比如文件在项目根目录 test <- read_excel(here("test_data.xlsx")) # 如果在data子文件夹 test <- read_excel(here("data", "test_data.xlsx"))
3. 其他排查点(概率较低,但可以确认)
- 包加载是否生效:确保
library(readxl)和library(tidyverse)放在文档开头的代码块里,且代码块没有设include=FALSE或eval=FALSE(你说其他代码能运行,这个可能性低,但可以确认)。另外,Knitting会启动新的R会话,所以可以加个保险:if (!require(readxl)) install.packages("readxl") library(readxl) - 文件锁定问题:确保
test_data.xlsx没有被Excel或其他程序打开,否则Knitting时会因为文件被锁定无法读取。 - 文件格式问题:尝试把Excel文件另存为
.xls格式,或者用read_xlsx()(注意是下划线,readxl包的另一个函数)试试,排除格式兼容问题。
修正后的代码块示例
{r, fig.width=6, fig.height=6, fig.align='center'} # 保险加载包 if (!require(readxl)) install.packages("readxl") library(readxl) library(tidyverse) set.seed(123) n <- 1000 x1 <- matrix(rnorm(n), ncol = 2) x2 <- matrix(rnorm(n, mean = 3, sd = 1.5), ncol = 2) x <- rbind(x1, x2) head(x) smoothScatter(x, xlab = "x1", ylab = "x2") # 用相对路径(或here包路径)读取文件 test <- read_excel("test_data.xlsx") # 查看Knitting时的工作目录,确认路径是否匹配 getwd()
内容的提问来源于stack exchange,提问作者focusperson




