当字符串包含无法识别的转义符时,R自定义错误消息

时间:2018-08-29 20:53:20

标签: r regex

当我的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用户。

2 个答案:

答案 0 :(得分:2)

R中的代码执行分为两个阶段。首先,R接受您输入的原始字符串并将其解析为可以运行的命令;然后,R实际上运行这些命令。解析步骤可确保您编写的内容实际上对代码有意义。如果没有任何意义,那么R甚至无法将其转换为可以尝试运行的任何东西。

在解析阶段,您将收到有关无法识别的转义序列的错误消息。这意味着R甚至没有真正尝试执行命令,只是直截了当地听不懂您在说什么。无法在代码中捕获这样的错误,因为此时没有用户代码在运行。

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

答案 1 :(得分:0)

如果您正确捕获了用户输入,对于字符串输入\,R会将其存储为my_string\\中。

readline()
\
[1] "\\"

readline()
sql\sql
[1] "sql\\sql"

这在R中内部表示:

my_string <- "sql\\sql"

但是

cat(my_string)

sql\sql

要检查输入,您需要对每个转义符进行转义,因为您正在寻找\\

stringr::str_detect(my_string, "\\\\")

如果输入字符串为TRUE,则返回sql\sql。所以整行是:

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