标签:enter img 资料 就会 它的 没有 lua bin mes
R语言中常用到的输出形式如下(这里不是指输出到文件):详细请参考:Linux中标准输出和标准错误的重导向
print()
print()是我们最为常用的输出形式,使用也非常方便。但是它也有一些缺点,首先它没有连接字符串的功能,如果你想讲多个字符串作为一个整体输出,那么要首先使用paste()函数将多个字符串连接成一个字符串。其次,最让人讨厌的是,每次print()输出,其前面都会有个序列号[x],如下,
print("Hello")
# [1] "Hello"
cat()
cat()的输出要比print()看着舒服很多,首先它可以自动以空格为分隔符,连接字符串。如下:
cat("Hello","World\n")
# Hello World
而且,cat()的输出内容前面没有序列号,看起来更加整洁。不过它的缺点,就是你必须要加换行符,否则所有内容就会在同一行显示。
message(),warning()和stop()
这三种输出以标准错误的形式输出,同时它们都有自动连接字符串的功能,和paste0()的连接形式相似。
message("Hello","Wold")
# HelloWold
warning("Hello","Wold")
# Warning message:
# HelloWold
stop("Hello","World")
# Error: HelloWorld
所以需要你在字符串中加上分隔符。
三者的作用有所不同,message()主要用于程序运行中,输出一些提示信息,不影响程序的运行;warning()是提示程序运行中可能存在的一些异常,但是不会影响程序本身的运行;而stop()是程序运行出现错误的时候,终止程序的运行,并抛出错误信息。例子如下:
for (i in list(2,1,0,-1,-2,"abc",3,5)){
message("Current i is: ",i)
print(log(i))
}
# Current i is: 2
# [1] 0.6931472
# Current i is: 1
# [1] 0
# Current i is: 0
# [1] -Inf
# Current i is: -1
# [1] NaN
# Current i is: -2
# [1] NaN
# Current i is: abc
# Error in log(i) : non-numeric argument to mathematical function
# In addition: Warning messages:
# 1: In log(i) : NaNs produced
# 2: In log(i) : NaNs produced
对一个列表list(2,1,0,-1,-2,”abc”,3,5)中的每一元素取对数,当遇到负数的时候,系统提示warning,并且返回了NaN。注意warning的信息通常在脚本运行结束的时候输出(否则你可能会错过warning的信息)。而当遇到列表中的字符串的时候,对字符串取对数直接提示了错误,并终止的程序的进行,后面列表中的元素,3和5,没有进行取对数。
异常的捕获
如在上面的例子中,遇到字符串程序便终止了,如果我们让程序跳过这个错误,继续往下执行,该怎么办呢?这就涉及到了程序运行中异常的捕获和处理。在R中比较常用的是tryCatch()函数。
for (i in list(2,1,0,-1,-2,"abc",3,5)){
message("Current i is: ",i)
tryCatch(
{print(log(i))},
warning = function(w) {message("Negative values!")},
error = function(e) {message("Enter numeric value!")}
)
}
# Current i is: 2
# [1] 0.6931472
# Current i is: 1
# [1] 0
# Current i is: 0
# [1] -Inf
# Current i is: -1
# Negative values!
# Current i is: -2
# Negative values!
# Current i is: abc
# Enter numeric value!
# Current i is: 3
# [1] 1.098612
# Current i is: 5
# [1] 1.609438
通过tryCatch()函数可以捕获一些异常情况,将异常情况处理,这样不会影响到后续程序的执行!
同样地,message()作为一种标准错误,也可以通过tryCatch()来捕获。下面是一个真实遇到的情况。有这么一组数据,我想拟合混合线性模型,但是在这个过程中出现了提示信息:
librar(lme4) # version 1.1-19
my_df <- data.frame("Group" = c(rep("Control",2), rep("Mutual",2)), "Rep" = c("a","b","c","d"),
"ref" = c(27,20,23,50),
"alt" = c(0,0,0,1))
print(my_df)
# Group Rep ref alt
# 1 Control a 27 0
# 2 Control b 20 0
# 3 Mutual c 23 0
# 4 Mutual d 50 1
my_df.model <- glmer(cbind(alt,ref) ~ Group + (1|Rep) , my_df, binomial)
# singular fit
这时出现了“singluar fit”的提示,它的出现不影响模型的输出,查看my_df.model仍然可以看到模型拟合结果,但是singular fit的出现意味着模型过度拟合,而我并不想把这种存在问题的模型放在我的结果中,所以,要捕获message()的提示信息,然后返回NA作为结果。
cal_lme <- function(my_df){
tryCatch({
my_df.model <- glmer(cbind(alt,ref) ~ Group + (1|Rep), my_df, binomial)
rr <- summary(my_df.model)
return(rr)},
message = function(m){
return(NA)
}
)
}
R中常用到的5种输出形式,包括两种标准输出: print()和cat(), 三种标准错误输出:message()、warning()和stop()。对于三种标准错误输出,可以通过tryCatch()函数捕获程序异常情况并处理。
tryCatch的使用模版:
tryCatch(
{when everything is normal},
message = function(m){},
warning = function(w){},
error = function(e){}
)
===== THE END ====
参考资料:
标签:enter img 资料 就会 它的 没有 lua bin mes
原文地址:https://blog.51cto.com/15069450/2577337