码迷,mamicode.com
首页 > 编程语言 > 详细

R语言中的输出及异常捕获

时间:2021-01-02 11:45:48      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:enter   img   资料   就会   它的   没有   lua   bin   mes   

R语言中常用到的输出形式如下(这里不是指输出到文件):

  1. print()
  2. cat()
  3. message()
  4. warning()
  5. stop
    上面5中输出形式,可以分为两类:print()和cat()是以标准输出(stdout)的形式输出;而剩下的三种(messages(), warning(), stop())是以标准错误(stderr)的形式输出。这类似于Linux环境中的输出形式。

详细请参考: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 ====

参考资料:

https://stackoverflow.com/questions/36699272/why-is-message-a-better-choice-than-print-in-r-for-writing-a-package

技术图片

R语言中的输出及异常捕获

标签:enter   img   资料   就会   它的   没有   lua   bin   mes   

原文地址:https://blog.51cto.com/15069450/2577337

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!