使用Rscript,有没有一个不错的方式来抑制非脚本输出?

11

可能重复:
R抑制依赖项的启动消息

我已经了解到使用sink("NUL")/sink("/dev/null"),但它们都没有解决我遇到的问题。即使我将library()命令包装在sink("NUL")sink()中,我的Rscript调用仍然输出各种我不想看到的信息:

Loading required package: Matrix
Loading required package: methods
Loading required package: lattice
Loaded glmnet 1.8

Loading required package: MASS
Loading required package: lme4

Attaching package: 'lme4'

The following object(s) are masked from 'package:stats':

    AIC, BIC

Loading required package: R2WinBUGS
Loading required package: coda

Attaching package: 'coda'

The following object(s) are masked from 'package:lme4':

    HPDinterval

Loading required package: abind
Loading required package: foreign

arm (Version 1.5-05, built: 2012-6-6)

Working directory is C:/Users/andrews/bootstraps/user/_branches/ER-PoC/Bootstraps/R


Attaching package: 'arm'

The following object(s) are masked from 'package:coda':

    traceplot

[1] "client=51"         "date='01-01-2011'"
[1] "01-01-2011"
[1] 51

我实际上只需要结尾的内容,也似乎只有使用sink()命令才能抑制输出。真的感觉应该有一个参数可以在Rscript中抑制此输出(如果我在控制台中source我的脚本,则甚至不会显示此输出)...有任何建议吗?


6
或许 ?suppressPackageStartupMessages 可以帮助吗? - Chase
3
关于将此问题作为重复关闭的事情,我想提一下:这个问题是关于一个脚本的,而被标记为重复的那个问题是关于一个包的。所以Joris的“silent”命名空间方法甚至不会被使用,而且suppressMessages()按照OP所述并不完全抑制输出。因此,“完全相同”的标记对这个用户没有帮助。 - Thell
谢谢,@Thell。当我提出这个问题时,我已经阅读了被识别的帖子,所以很高兴你同意我的看法。 - Claire Sannier
1个回答

9

安德鲁,我也遇到了同样的问题,suppressMessages()并不能移除所有额外的输出,但是使用sink(),用capture.output()包裹suppressMessages()可以解决。

$ rscript --vanilla -e 'library(Rmpfr)'
Loading required package: methods
Loading required package: gmp
---->8----
Loading C code of R package 'Rmpfr': GMP using 32 bits per limb
---->8----


$ rscript --vanilla -e 'suppressMessages( library(Rmpfr) )'
Loading C code of R package 'Rmpfr': GMP using 32 bits per limb


$ rscript --vanilla -e 'msg.out <- capture.output( suppressMessages( library(Rmpfr) ) )'

加载Rmpfr包时会出现几个使用“message”连接编写的良好的启动消息,以及一个使用“output”连接的不太友好的消息。当然,你可以自己创建和操作“sink()”,但这就是“capture.output()”已经设置好的内容。
也许设置一个详细参数来获得更多控制会有所帮助:
$ cat sample.R
#!/c/opt/R/R-2.15.0/bin/rscript --vanilla

cmd_args <- commandArgs( TRUE );

if( length( cmd_args ) > 0 ) {
  eval( parse( text = cmd_args[1] ) )
}

if( exists( "verbose" ) ) {
  library( Rmpfr )
} else {
  msg.trap <- capture.output( suppressMessages( library( Rmpfr ) ) )
}

print("Hello")

产生的结果是:
$ ./sample.R
[1] "Hello"


$ ./sample.R "verbose=TRUE"
Loading required package: methods
Loading required package: gmp

Attaching package: 'gmp'
---->8----
[1] "Hello"

这里有很多你可以尝试的东西,但至少你可以看到如何完全禁止消息输出。

希望对你有所帮助。玩得开心!


这看起来像是解决方案。我应该补充说明一下,我的主脚本首先会引用其他四个脚本,并且library()语句都在这些辅助脚本中。即便如此,在source()调用中包装capture.output(suppressMessages())几乎可以解决问题...现在,我只需要在期望的输出之前为每个source()调用添加一个character(0)输出行。你有什么想法吗?无论如何,非常感谢! - Claire Sannier
就在那里:只需使用suppressMessages()而不是capture.output()即可解决整个问题。再次感谢! - Claire Sannier
1
你收到 character(0) 的原因是你没有将捕获的输出分配给任何变量,所以它被打印出来了,在你的特定情况下整个消息已经被抑制了。请注意,仅使用 suppressMessages() 并不总是会留下一个空的字符数组;就像上面第二个示例命令中一样,即使使用 suppressMessages(),Rmpfr 仍会输出初始化消息。 - Thell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接