当我的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用户。
答案 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")