r - 当字符串包含无法识别的转义时,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 用户。
解决方案
R 中的代码执行分两个阶段进行。首先,R 获取您输入的原始字符串并将其解析为可以运行的命令;然后,R 实际运行这些命令。解析步骤确保您编写的内容实际上作为代码有意义。如果它没有任何意义,那么 R 甚至不能把它变成它可以尝试运行的任何东西。
您收到的关于无法识别的转义序列的错误消息发生在解析阶段。这意味着 R 甚至没有真正尝试执行命令,它只是直接无法理解你在说什么。没有办法在代码中捕获这样的错误,因为此时没有正在运行的用户代码。
因此,如果您指望您的用户编写类似的代码my_string <- "something"
,那么他们需要编写有效的代码。它们无法更改字符串的编码方式、赋值运算符的外观或变量的命名方式。他们也不能打字!my_string! <=== %something%
,因为 R 也不能解析。R 无法解析my_string <- "sql\sql"
,但它可以解析my_string <- "sql\\sql"
(斜线在字符串文字中很多被转义)。如果他们不是精明的用户,您可能需要考虑提供一个替代界面,该界面可以在尝试将其作为代码运行之前清理用户输入。也许做一个闪亮的前端或让用户通过命令行参数将参数传递给您的脚本。
推荐阅读
- java - 我需要一个 TreeMap,其中每个 id 数据的 Key 将是 id 和 value(将是一个 hasMap 在该名称中将是 id & values 将是其余详细信息)?
- php - 尝试在全新安装的 Laravel 5.7 的刀片模板中使用 @foreach 时出现“未定义的变量:发布”
- c++ - C++ 正则表达式示例输出与官方不同
- c# - 在此上下文中启动了第二个操作
- php - 将 CSV 转换为 JSON 数组的正确方法
- vue.js - 无法导入 vuex 商店以请求文件
- java - 如何给 JList 一个 ID 和名称?
- python - 我可以在 python 中同时连接到两个不同的 websockets 服务器吗?
- django - django.template.exceptions.TemplateSyntaxError: 'django_markdown' 不是注册的标签库
- python - Tensorflow 在隐藏层返回相同的权重