【发布时间】:2021-04-19 16:30:00
【问题描述】:
当我第一次学习 NSE 时,我有一个函数用于接受不带引号的输入,现在我讨厌这个用例。我想强制该函数只接受一个字符串,但向用户提供一个明确的错误消息。
我的问题是测试正在传递的输入类型。我可以使用rlang::quo_is_symbol(rlang::enquo(str_x)),但是将多个函数链接在一起时会失败。这是我在代表处的剪辑。
fun1 <- function(str_x) {
depr_str_x(str_x)
paste("this is x", str_x)
}
depr_str_x <- function(str_x) {
if (rlang::quo_is_symbol(rlang::enquo(str_x))) {
stop("this is a clear error message to the user")
}
invisible(NULL)
}
所以当我运行它时,我得到了我想要的。
depr_str_x("test") # nothing (which I want)
depr_str_x(test) # my custom error (which I want)
但是当我运行它时,我两次都得到错误。我如何让它认识到正在传递的"test" 是一个字符串?我也尝试过rlang::is_scalar_character(),但对于符号大小写失败了。我希望有一种快速简便的方法可以做到这一点,而无需强制评估并查看它是否失败或其他什么。
fun1("test") # my custom error (which I don't want)
fun1(test) # my custom error (which I want)
此外,当该函数在其他函数内部使用时,这应该可以工作。这就是我不断遇到问题的地方。
fun2 <- function(str_x) fun1(str_x)
fun2("test") # my custom error (which I don't want)
fun2(test) # my custom error (which I want)
【问题讨论】:
-
我不希望未引用的工作。我明确地试图阻止它。这就是我以前拥有它的方式,但我想删除该功能,因为它会导致不好的做法,因为这个包会在其他包中使用。它导致发生其他错误。但我不想在不显示明显错误的情况下将其删除。
-
我更新了帖子,但我只是想知道错误消息中的前缀部分是否重要是
depr_str_x(!!str_x)而不是depr_str_x(test) -
不,我想你得到了我想要的。那会很好。我正在处理你的更新。