
466
|
第
15
章
15.8 防止错误
15.8.1 问题
你预计会有致命错误的可能性,但需要继续处理而不是完全停止。
15.8.2 解决方案
使用 possibly 函数来“包装”有问题的代码。它会捕获错误并让你对它们做出
响应。
15.8.3 讨论
添加包 purrr 中包含一个名为 possibly 的函数,它接受两个参数。第一个参数是
一个函数,possibly 会防止该函数出现故障。第二个参数是一个名为 otherwise
的值。
这里有一个具体的例子。read.csv 函数尝试读取文件,但如果文件不存在则程序会暂
停。这可能是不受欢迎的。我们可能希望恢复程序并继续。
我们可以用这种方式将 read.csv 函数“包装”在保护层中:
library(purrr)
safe_read <- possibly(read.csv, otherwise=NULL)
这可能看起来很奇怪,但 possibly 将会返回一个
新函数
。这里名为 safe_read 的新
函数的行为与旧函数 read.csv 完全相同,但有一个非常重要的区别。当 read.csv
失败并停止时,safe_read 将返回 otherwise 的值(即 NULL)并继续处理。(如果
read.csv 成功,则会获得通常的结果,即一个数据框。)
可以按如下方式使用 safe_read 来处理可选文件:
details = safe_read("details.csv") # Try to read details.csv file
if (is.null(details)) ...