如何抑制R.Net运行时产生的所有控制台输出
R.NET 屏蔽所有控制台输出的实现方案
之前尝试的NullCharacterDevice和invisible()无法生效的核心原因:
invisible()仅能抑制R函数返回值的自动打印,无法拦截包加载时通过cat()、packageStartupMessage()主动输出的提示信息- 单独传入
NullCharacterDevice只能接管R初始化完成后通过托管通道转发的输出,无法捕获R启动早期的原生控制台输出、以及走独立message通道的提示内容
按以下步骤配置即可实现完全无控制台输出:
- 传入静默启动参数初始化REngine
初始化时不要传空的启动参数,加入R原生静默启动相关参数,从启动阶段就关闭默认输出:
// 启动参数说明:--slave 静默模式无交互提示,--no-save/--no-restore 不读写工作空间,--no-environ 不加载环境变量配置 var startupArgs = new[] {"--slave", "--no-save", "--no-restore", "--no-environ"}; var engine = REngine.GetInstance(); engine.Initialize(startupArgs, new NullCharacterDevice());
- 初始化后第一时间重定向R的所有输出流
在执行任何业务R代码、加载第三方包之前,先把R的输出流、消息流全部重定向到系统空设备,R内置的nullfile()函数会自动适配Windows(nul)和类Unix系统(/dev/null)的空设备路径:
// 重定向普通输出流 engine.Evaluate("sink(nullfile(), type = 'output')"); // 重定向消息、警告、错误提示流 engine.Evaluate("sink(nullfile(), type = 'message')");
- 加载包时开启静默参数
加载第三方包时不要仅用invisible()包裹,直接调用library()的quietly参数,从包加载层面关闭启动提示:
engine.Evaluate("library(tseries, quietly = TRUE)");
如果以上配置后仍有极少量R启动早期的原生输出,可以在初始化REngine前临时将当前进程的Console标准输出、标准错误流重定向到空流,初始化完成后再按需恢复,常规场景下前三步配置已经可以覆盖所有输出场景。
内容的提问来源于stack exchange,提问作者trenki
相关产品推荐
相关产品推荐

