R Markdown knit后HTML中图表不可见问题求助
我帮你梳理几个最可能导致这个问题的原因,以及对应的解决办法,你可以逐一排查:
检查绘图代码块的Chunk选项
有时候你可能无意中给代码块加了fig.show='hide'或者eval=FALSE这类参数,手动运行代码块的时候这些参数不会生效,但knit的时候会严格遵循设置。打开你的Rmd文件,找到所有绘图的代码块,确认开头的{r ...}里没有这类禁用输出的参数。比如正确的代码块开头应该是类似{r, fig.width=6, fig.height=4},确保eval=TRUE(默认就是TRUE,除非你手动改了),fig.show没有设为hide。确保ggplot等绘图对象被明确打印
这是个非常常见的坑!如果你用ggplot2绘图,只是赋值给变量但没有打印,比如:p <- ggplot(mtcars, aes(wt, mpg)) + geom_point()手动运行时R控制台会自动打印这个对象,但knit的时候不会。你需要在代码块里加上
print(p),或者直接不赋值,把绘图代码写在一行:ggplot(mtcars, aes(wt, mpg)) + geom_point()避免手动调用绘图设备(如png())后未关闭
如果你的代码里手动打开了绘图设备,比如:png("my_plot.png") plot(mtcars$wt, mtcars$mpg)但没有加上
dev.off()来关闭设备,knit的时候这个设备会一直占用,导致图表无法嵌入到HTML里。解决办法是要么加上dev.off(),要么直接让R Markdown自动处理绘图设备,不要手动调用png/jpeg等函数。检查工作目录一致性
手动运行代码时的工作目录可能和knit时的不一样,导致绘图依赖的数据文件找不到(虽然你说没有报错,但还是可以排查)。你可以在代码开头加上这行来强制设置工作目录为当前Rmd文件所在的目录:setwd(dirname(rstudioapi::getSourceEditorContext()$path))清除缓存后重新Knit
如果你的代码块设置了cache=TRUE,旧的缓存可能损坏或者没有包含图表数据。你可以在RStudio里点击Knit按钮旁边的下拉箭头,选择"Clear Knit Cache",然后重新运行Knit操作。
你可以先从最常见的「打印ggplot对象」和「检查Chunk选项」开始排查,应该能解决大部分问题。
内容的提问来源于stack exchange,提问作者Raj

