R_Language 板


LINE

[关键字]: R, 例外处理, exception [重点摘要]: 简单的分享我对於R 的例外处理相关的心得 R 的官方文件在[Exception handling](http://cran.r-project.org/doc/manuals/R-lang.html#Exception-handling) 有介绍R的例外处理机制。 这里我简单介绍如何在R写出类似java、c++或python等主流语言所使用的try-catch机制 。 另外这里讲的都是以R2.15为主。 # 错误相关的函数 - `warning(...)`: 抛出一个警告 - `stop(...)`: 抛出一个例外 - `surpressWarnings(expr)`: 忽略`expr`中发生的警告 - `try(expr)`: 尝试执行 - `tryCatch`: 最主流语言例外处理的方法 - `conditionMessage` : 显示错误讯息 # R 和其他主流语言的不同 R 语言处理例外的方式,是透过函数,而非像其他主流语言使用try ... catch ... 等语 法。这是因为R 语言几乎所有功能都是用函数来实作的。请参考[Every operation is a function call](https://github.com/hadley/devtools/wiki/Functions#every-operation-is-a-function-call) 。 # 一个`try`的范例 我自己最早是先发现`try`函数。`try`的用法近似於回传expr的结果*或*执行时发生的错 误。 ```r result <- try(..., silent=TRUE) if (class(result) == "try-error") { ... # 错误处理 } ``` 由於R是我第一个语言,所以我也就接受他了。直到我後来发现主流语言的try -- catch 机制後,才觉得奇怪。 # 一个`tryCatch`的范例 後来我发现`tryCatch`函式提供了比较类似try -- catch机制的错误处理方法。 ```r tryCatch({ result <- expr }, warning = function(w) { ... # 警告处理 }, error = function(e) { ... # 错误处理 }, finally { ... # 清理 } ``` 这种语法和其他主流语言的机制比起来接近多了。 # `conditionMessage` 有时候当错误发生时,我无法处理,需要直接回传错误讯息给使用者时,或是log起来时 ,我们可以在`tryCatch`中使用`conditionMessage`来撷取错误讯息。 ```r tryCatch({ stop("demo error") }, error = function(e) { conditionMessage(e) # 这就会是"demo error" }) ``` # 错误处理的相关issue 就我的经验来说,写出一个稳健的程式码是非常不容易的。在软体工程中有许多文章介绍 如何写出这类程式码。 大部份R 写出来的script都是只用一次的,所以程式稳定不稳定就不是重点,也因此大家 都很少去使用R 的例外处理机制。 某些R 使用者,会需要写出自动化的script。而这时候为了要让回圈不中断,使用者才开 始使用例外处理。 但是当写到套件时,例外处理就很重要了。这时候,函数的使用者将不再是开发者自己, 而还包括其他的使用者,甚至是其他的开发者。此时例外处理就变成一门哲学了。这部份 我也只略懂皮毛,下面只列出少许我知道的issue: - 释放资源: 由於错误发生时,函数会在不正常的地方退出,所以此时需要释放一些函数 中获得的资源(如资料库连线需要关闭)。这部份在C++可以用 [RAII](http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)等 技术来保证资源不会被忘记释放。然而在R中,我还不知道有什麽类似的安全机制。 - exception safety guarantees: 当使用者要基於某些函数建立复杂的程式时,通常希 望这些函式是不会出错的。[Exception safety](http://en.wikipedia.org/wiki/Exception_safety)就是在探讨相关的issue。 毕竟使用的函数有例外状况时,原本的函数也跟着会有例外状况。就像是盖在危楼上的楼 层,一定也很危险一样。目前我也尚未看过R在这部份的功能。 - 错误讯息: 当错误发生时,提供的错误讯息是否能帮助使用者找到发生错误的理由。R 在这部份也很不足,这造成要除错R的程式时,没有相当的经验,是无法理解错误讯息的 。 # 参考资料 - [Exception handling](http://cran.r-project.org/doc/manuals/R-lang.html#Exception-handling) - [Using R — Basic error Handing with tryCatch()](http://mazamascience.com/WorkingWithData/?p=912) --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 36.228.124.114
1F:推 johnsonla:大推这篇!!! 整个受用:P 04/04 23:48
2F:→ clickhere:gc() 可以释放 R 的 memory. 但外部呼叫的部份crash, 就 04/05 02:34
3F:→ clickhere:不是R能掌握的. 所以要自己去 free 了. 但如果是由 R 04/05 02:35
4F:→ clickhere:allocated 的部份, gc() 还是可以释放的. 04/05 02:36
5F:→ clickhere:try or tryCatch 是很耗资源的. 本身就是 function call 04/05 02:37
6F:→ clickhere:call了, 它们自建一个 environment 另外去执行了. 04/05 02:38
7F:→ andrew43:好文! 有用! 04/08 10:11







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP