R语言:选择性屏蔽输出及输出重定向

在linux中,很多命令的默认输出是stout,一般stout就是指的屏幕,而在需要的时候还可以将输出重定向,比如将输出转至文件中保存,使用>就可以实现,比如:

ls ~ > content.txt # 将Home文件夹下的文件名列表保存至content.txt中

而且linux的输出还可以细分为标准输出和标准错误输出,分别使用12来表示。

123 2> test.txt # linux下123是非法命令,所以正常情况下,屏幕会提示"123: command not found",但是错误输出重定向之后,警示信息会在test.txt中保存

123 1> test.txt # 如果重定向的是1,就会发现错误信息依然打印到屏幕上
#123: command not found

R中的输出类型

类似的,R中的输出也可以分为两种:”Output”与”Message”。

Output是正常输出,类似于linux的标准输出,一般是print或者潜在调用的print方法输出的结果。

Message是R中的一些错误(error)、警告(warning)及提示信息(message),恰好类似于linux中的标准错误输出。

Message在调用函数时常常会出现,一般情况下没有问题,当我们自己也要写函数时,尤其此时又使用了循环时,屏幕就会出现很多的警告、提示信息,而我们自己写的函数的警示很可能就被掩盖了,这时我们需要屏蔽或者重定向他们。

屏蔽屏幕输出

warning:使用suppressWarnings屏蔽

warning("test")
#Warning message:
#test 
suppressWarnings( warning("test") )

message:使用suppressMessages屏蔽

message("ABC""DEF")
#ABCDEF
suppressMessages( message("ABC""DEF") )

函数返回对象:使用invisible

# 尤其是在使用lapply的时候,如果不需要返回值,那么invisible很好用
# R中有一些操作:打印或保存文件是不需要返回值的

# 如下可以看到,打印完内容后,函数又返回给lapply一个列表,然后再次打印一遍:
library(tidyverse)
file_name <- paste0("file"1:5".txt")
lapply(file_name, function(file){
    print(file)
})
#[1] "file1.txt"
#[1] "file2.txt"
#[1] "file3.txt"
#[1] "file4.txt"
#[1] "file5.txt"
#[[1]]
#[1] "file1.txt"

#[[2]]
#[1] "file2.txt"

#[[3]]
#[1] "file3.txt"

#[[4]]
#[1] "file4.txt"

#[[5]]
#[1] "file5.txt"

# 可以使用invisible屏蔽
lapply(file_name, function(file){
    print(file)
}) %>% invisible()
#或者 lapply(file_name, print) %>% invisible()
#[1] "file1.txt"
#[1] "file2.txt"
#[1] "file3.txt"
#[1] "file4.txt"
#[1] "file5.txt"

由于上述这种迭代方式还是挺普遍的,所以purrr中有一组walk函数,专门用来做这件事情:

purrr::walk(file_name, print)
#[1] "file1.txt"
#[1] "file2.txt"
#[1] "file3.txt"
#[1] "file4.txt"
#[1] "file5.txt"

然而walk函数并非总是好用的,一些比较冷门的场景还是需要lapply + invisible来实现,比如xlsx包的setColumnWidth就是如此,就不举例了。

输出重定向

R中也可以实现输出的重定向,通过sink来实现。

### sink的type参数控制对"标准输出"或者"标准错误输出"重定向
## 标准输出重定向---------
out <- file("out.txt", open="w")
sink(out, type="output"#将标准输出重定向

warning("test")
message("ABC""DEF")
print("Normal output")

sink() #取消重定向
close(out) #关闭文件,以查看文件
#[1] "Normal output" #打开out.txt的内容如左

## 标准错误输出重定向---------
out <- file("out.txt", open="w")
sink(out, type="message"#将标准输出重定向

warning("test")
message("ABC""DEF")
print("Normal output")

sink(type="message"#取消重定向
close(out) #关闭文件,以查看文件
#Warning message:    #打开out.txt的内容如左
#test 
#ABCDEF

#PS:执行完成后,文件对象需要关闭,如果无法关闭,使用closeAllConnections来关闭

##也可以同时对标准输出和标准错误输出重定向,同时执行两个sink即可,如下
#sink(out) #默认是output重定向
#sink(out, type="message")

PS:上周聊到ggplot2绘图的aes的变量传参问题,其实aes_string可以实现变量传字符串给aes函数,如下:

data(mtcars)
mtcars %>% ggplot(aes(gear, mpg, group=gear)) + geom_boxplot() #正常boxplot图

x <- "gear"
y <- "mpg"
mtcars %>% ggplot(aes(x, y, group=gear)) + geom_boxplot() #此时是无法得出想要的图的
mtcars %>% ggplot(aes_string(x, y, group=x)) + geom_boxplot() #使用aes_sting即可

PSS:使用dplyr的函数进行编程,如果使用sym、expr及quo等方式是比较繁琐的(具体见上周内容),其实有更简单的方式来实现,那就是{{}}、all_of及.data,具体如何操作?

参考资料

R文档

生物信息学

基因通路富集分析方法总结

2020-6-23 22:59:44

生物信息学

pandas合并和连接多个数据框

2020-6-24 21:14:04

声明 本网站部分文章源于互联网,出于传递更多信息和学习之目的转载,并不保证内容正确或赞同其观点。
如转载稿涉及失效、版权等问题,请立即联系管理员;我们会予以修改、删除相关文章,请留言反馈
Notice: When your legal rights are being violated, please send an email to: [email protected].
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索