首页 > 解决方案 > 当字符串包含无法识别的转义时,R自定义错误消息

问题描述

当我的 R 函数的用户提供带有无法识别转义的字符串时,我想提供更多信息性错误消息

my_string <- "sql\sql"
# Error: '\s' is an unrecognized escape in character string starting ""sql\s"

像这样的东西将是理想的。

my_string <- "sql\sql"
# Error: my_string contains an unrecognized escape. Try sql\\sql with double backslashes instead.

我尝试了一个查找单个反斜杠的 if 语句

if (stringr::str_detect("sql\sql", "\")) stop("my error message")

但我得到同样的错误。

我的几乎所有用户都是运行 R 3.3 及更高版本的 Windows 用户。

标签: rregex

解决方案


R 中的代码执行分两个阶段进行。首先,R 获取您输入的原始字符串并将其解析为可以运行的命令;然后,R 实际运行这些命令。解析步骤确保您编写的内容实际上作为代码有意义。如果它没有任何意义,那么 R 甚至不能把它变成它可以尝试运行的任何东西。

您收到的关于无法识别的转义序列的错误消息发生在解析阶段。这意味着 R 甚至没有真正尝试执行命令,它只是直接无法理解你在说什么。没有办法在代码中捕获这样的错误,因为此时没有正在运行的用户代码。

因此,如果您指望您的用户编写类似的代码my_string <- "something",那么他们需要编写有效的代码。它们无法更改字符串的编码方式、赋值运算符的外观或变量的命名方式。他们也不能打字!my_string! <=== %something%,因为 R 也不能解析。R 无法解析my_string <- "sql\sql",但它可以解析my_string <- "sql\\sql"(斜线在字符串文字中很多被转义)。如果他们不是精明的用户,您可能需要考虑提供一个替代界面,该界面可以在尝试将其作为代码运行之前清理用户输入。也许做一个闪亮的前端或让用户通过命令行参数将参数传递给您的脚本。


推荐阅读