R语言中使用ncdf4读取远程NetCDF文件无法抑制控制台输出问题
解决ncdf4读取远程NetCDF时控制台大量输出的问题
我之前也碰到过一模一样的情况!问题出在ncdf4包调用的底层netCDF C库会直接向系统的标准输出(stdout)或标准错误(stderr)打印内容,而R自带的sink、captureOutput这类工具只能捕获R语言层面的输出,管不住底层C代码的输出。下面给你几个实用的解决办法:
方法1:利用nc_open的verbose参数(最简便)
其实nc_open函数本身就有控制输出的参数!默认情况下verbose = TRUE,会打印连接过程的详细信息,把它设为FALSE就能直接抑制这些输出:
library(ncdf4) url <- "http://iridl.ldeo.columbia.edu/SOURCES/.WORLDCLIM/.AMT/X/%28-165.000000%29VALUE/X2/%288.211400%29VALUE/Y/%2845.000000%29VALUE/Y2/%28-6.032500%29VALUE/dods" nc <- nc_open(url, verbose = FALSE)
这个方法应该能解决大部分情况,因为你看到的输出基本都是verbose模式下的连接日志。
方法2:捕获底层C输出(针对更顽固的情况)
如果还是有残留输出,那可以用capture.output同时捕获标准输出和错误流,或者用withr包的工具来临时重定向所有输出:
用capture.output同时捕获stdout和stderr
library(ncdf4) url <- "http://iridl.ldeo.columbia.edu/SOURCES/.WORLDCLIM/.AMT/X/%28-165.000000%29VALUE/X2/%288.211400%29VALUE/Y/%2845.000000%29VALUE/Y2/%28-6.032500%29VALUE/dods" # 捕获所有输出,包括底层C的内容 capture.output( nc <- nc_open(url), type = c("output", "message") )
用withr::local_sink临时重定向
如果你不想保存输出,只是想彻底屏蔽,可以用withr包的local_sink:
library(ncdf4) library(withr) url <- "http://iridl.ldeo.columbia.edu/SOURCES/.WORLDCLIM/.AMT/X/%28-165.000000%29VALUE/X2/%288.211400%29VALUE/Y/%2845.000000%29VALUE/Y2/%28-6.032500%29VALUE/dods" # 临时重定向到空文件,执行完自动恢复 withr::local_sink(file = tempfile(), type = c("output", "message")) nc <- nc_open(url)
方法3:修改环境变量(全局屏蔽netCDF输出)
如果经常遇到这类问题,可以设置netCDF的环境变量来全局关闭调试输出:
# 在加载ncdf4之前设置环境变量 Sys.setenv("NC_VERBOSE" = "0") library(ncdf4) url <- "http://iridl.ldeo.columbia.edu/SOURCES/.WORLDCLIM/.AMT/X/%28-165.000000%29VALUE/X2/%288.211400%29VALUE/Y/%2845.000000%29VALUE/Y2/%28-6.032500%29VALUE/dods" nc <- nc_open(url)
这个环境变量会告诉底层netCDF库不要打印任何调试信息,适合长期使用。
内容的提问来源于stack exchange,提问作者Alexey Shiklomanov
相关产品推荐
相关产品推荐

