You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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=FALSEeval=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

火山引擎 最新活动