在linux中,很多命令的默认输出是stout,一般stout就是指的屏幕,而在需要的时候还可以将输出重定向,比如将输出转至文件中保存,使用>
就可以实现,比如:
ls ~ > content.txt # 将Home文件夹下的文件名列表保存至content.txt中
而且linux的输出还可以细分为标准输出和标准错误输出,分别使用1
和2
来表示。
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文档