使用R下载NetCDF文件:手动可行但download.file函数报错
解决R中
download.file下载NetCDF FTP文件触发断言错误的问题 我之前处理NOAA的NWM数据时也碰到过一模一样的问题——手动用FTP客户端能正常下载,但R里用download.file就会触发nc4file.c的断言错误,甚至直接搞崩RStudio。这本质上是下载模式不匹配或者FTP连接设置不对导致的,给你几个亲测有效的解决办法:
1. 切换到libcurl下载方法并启用二进制模式
download.file默认的下载方法(比如Windows上的wininet)对二进制NetCDF文件的支持不太友好,而且可能没正确处理FTP的传输模式。换用libcurl方法,同时指定mode = "wb"(二进制写入)就能解决大部分问题:
# 替换成你要下载的具体文件名 ftp_url <- "ftp://ftpprd.ncep.noaa.gov/pub/data/nccf/com/nwm/prod/nwm.20180425/medium_range/nwm.t00z.medium_range.channel_rt.f001.conus.nc" download.file(ftp_url, destfile = "nwm_local.nc", method = "libcurl", mode = "wb")
2. 用RCurl包直接处理FTP连接
如果上面的方法还是不行,试试用更灵活的RCurl包来下载,它对FTP的参数控制更细致:
library(RCurl) # 启用二进制传输,避免文件损坏 nc_content <- getURLContent(ftp_url, binary = TRUE) # 写入本地文件 writeBin(nc_content, "nwm_local.nc")
3. 强制启用FTP被动模式
有些FTP服务器(包括NOAA的这个)要求使用被动模式连接,默认的下载方法可能没开启这个选项。用libcurl时可以通过extra参数指定:
download.file(ftp_url, destfile = "nwm_local.nc", method = "libcurl", mode = "wb", extra = "--ftp-pasv")
为什么手动下载没问题?
手动FTP客户端(比如FileZilla)会自动检测文件类型并启用二进制传输,同时默认开启被动模式,这些都是R的download.file默认设置没做到的。如果下载的NetCDF文件因为传输模式错误被损坏,NetCDF库读取时就会触发断言错误(也就是你看到的nc4file.c第2771行的报错)。
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

