R包无法访问inst文件夹内文件的问题排查与解决
更新:问题已解决
修复后的代码如下:
x <- tolower(name) sysloc <- system.file(package="RanglaPunjab") x <- paste(sysloc,"/img/",x,".jpg", sep="") jj <- readJPEG(x,native=TRUE) plot(0:1,0:1,type="n",ann=FALSE,axes=FALSE) rasterImage(jj,0,0,1,1)
问题背景
我按照教程创建了R包RanglaPunjab,知道inst文件夹里的文件会完整保留在最终包中,所以把ShowPalettePhoto(name)函数需要的图片放在了inst/img目录下。本地安装包后,img文件夹和R文件夹处于同一层级。
最初我用这段代码访问图片:
x <- paste("./img/",x,".jpg", sep="") jj <- readJPEG(x,native=TRUE) plot(0:1,0:1,type="n",ann=FALSE,axes=FALSE) rasterImage(jj,0,0,1,1)
结果运行时出现错误:
Error in readJPEG(x, native = TRUE) : unable to open ./img/teej.jpg

错误原因及解释
你最初的代码问题出在相对路径的使用方式上:
./img/xxx.jpg这种相对路径是基于当前R会话的工作目录,而不是包安装后的实际路径。当用户加载你的包运行函数时,他们的工作目录几乎不可能刚好是包的安装目录,自然找不到图片文件。- R包中访问内部资源的标准做法是用
system.file()函数,它会自动定位到包安装后的根目录,不管用户当前工作目录在哪里,都能精准拼接出图片的正确路径——这也是你后来修复代码时用到的方法。
简单总结:包内资源绝对不能依赖相对路径,必须用system.file()来获取包的安装路径,再拼接资源路径,这样才能保证函数在任何环境下都能正常工作。
内容的提问来源于stack exchange,提问作者Artie Ladie
相关产品推荐
相关产品推荐

