R中tryCatch处理无效链接仅返回警告不报错、返回NULL而非NA问题
问题原因
- 核心是R版本的底层行为差异,不是你的操作错误:原高赞回答的测试环境是更早的R 3.x版本,在该版本中,
readLines传入不存在的路径时会直接抛出错误,触发error处理分支返回NA,同时输出错误日志。而你使用的R 4.0+版本对本地文件读取的异常分级做了调整:当传入的路径没有http/https等网络协议前缀时,R会优先判定为本地文件路径,找不到对应文件时仅抛出警告而非错误,因此直接触发了代码中的warning处理分支,返回NULL,不会走到error逻辑。 - 补充说明:你代码里
readLines的warn=FALSE参数仅用于抑制读取文件内容时的换行符不规范警告,不会屏蔽连接不存在的系统级警告,因此无效路径的警告依然会被捕获。
调整方案(如果需要和原回答效果对齐)
可以修改warning处理函数的逻辑,判断警告内容为连接/文件不存在时,直接返回NA即可,示例修改如下:
warning=function(cond) { message(paste("URL caused a warning:", url)) message("Here's the original warning message:") message(cond) # 新增判断:如果是文件/连接不存在类的警告,返回NA if(grepl("cannot open file|No such file or directory", cond)){ return(NA) } return(NULL) }
也可以在执行readLines前先校验路径合法性,不符合URL规则也不存在本地文件的直接抛出错误,走error分支即可。
内容的提问来源于stack exchange,提问作者bildanderwand
相关产品推荐
相关产品推荐

