R包提交CRAN后Debian系统无法读取JPEG图片的问题求助
我在Windows 10的RStudio 1.1.453里开发了R包RanglaPunjab,代码托管在GitHub。本地运行devtools::check()的时候完全没问题,没有错误、警告或提示,但提交到CRAN后,Debian环境下执行ShowPalettePhoto("GoldenTemple")出现了下面的错误:
> ShowPalettePhoto("GoldenTemple") Error in readJPEG(x, native = TRUE) : unable to open /srv/hornik/tmp/CRAN/RanglaPunjab.Rcheck/RanglaPunjab/img/goldentemple.jpg Calls: ShowPalettePhoto -> readJPEG
我的ShowPalettePhoto函数实现是这样的:
ShowPalettePhoto <- function(name){ pal <- RanglaPunjab(name) if (is.null(pal)) stop("palette not found.") x <- tolower(name) sysloc <- system.file(package="RanglaPunjab") x <- paste (sysloc,"/img/",x,".jpg", sep="") jj <- readJPEG(x,native=TRUE) graphics::plot(0:1,0:1,type="n",ann=FALSE,axes=FALSE) graphics::rasterImage(jj,0,0,1,1) }
请问怎么修改这个函数,让它能在Debian和其他操作系统正常显示图片?
解决方向
1. 用跨系统的路径拼接函数替代手动拼接
Windows和类Unix系统(比如Debian)的路径分隔符不同,手动用paste拼接/会在Windows下出现潜在问题,更可靠的是用file.path()函数,它会自动根据当前系统选择正确的分隔符:
x <- file.path(sysloc, "img", paste0(x, ".jpg"))
2. 严格保证文件名大小写一致
Debian是大小写敏感系统,而Windows不是。你代码里把name转成了小写,但要确保包内img文件夹里的图片文件名完全是小写格式(比如goldentemple.jpg,而非GoldenTemple.jpg)。如果本地Windows的文件名是大小写混合的,复制到Debian环境会因为匹配失败找不到文件,务必统一文件名和代码转换后的格式。
3. 确认图片文件被正确打包进R包
检查包的DESCRIPTION和.Rbuildignore文件,确保img文件夹没有被排除在构建范围外。可以本地执行devtools::build()生成包文件,解压后查看img目录和图片是否存在,验证打包的完整性——CRAN环境会重新构建包,若图片未被正确包含,必然出现文件缺失错误。
4. 简化文件路径的获取方式
system.file支持直接定位包内文件,不需要先获取包根目录再拼接,这种方式更简洁且不易出错:
x <- system.file("img", paste0(tolower(name), ".jpg"), package = "RanglaPunjab")
同时可以提前检查文件是否存在,抛出更友好的错误:
if (x == "") { stop("Photo file not found for palette: ", name) }
5. 确保类Unix系统下的文件可读权限
Debian这类系统要求文件有可读权限才能被R读取,确保图片文件的权限设置为644(普通可读权限)。如果是在Windows下打包的,可能权限会有异常,本地可以在类Unix环境下构建包并验证权限,或者在打包前调整好文件权限。
内容的提问来源于stack exchange,提问作者Artie Ladie

