使用tidyeval编写ggplot2函数时,NA检查触发NSE错误的求助
问题原因与解决方案
错误原因
直接用is.na(x)检查参数是否为空的方式不适用tidyeval场景:当你传入x = Species时,x是一个未求值的符号(symbol),is.na()会尝试在函数执行环境中查找Species对象,而该对象仅存在于iris数据框内,因此触发"object 'Species' not found"错误。
正确解决方案
使用tidyeval工具集中的函数判断参数是否被用户指定,步骤如下:
- 将参数默认值设为
rlang::missing_arg(),表示参数默认处于缺失状态 - 用
rlang::quo_is_missing()结合enquo()检查参数是否被用户传入
修改后的完整函数代码:
library(rlang) library(ggplot2) library(dplyr) my_func <- function(data, x = missing_arg(), y = missing_arg()) { # 检查x和y是否同时未指定 if (quo_is_missing(enquo(x)) && quo_is_missing(enquo(y))) { stop("`x` and `y` cannot both be missing.") } if (quo_is_missing(enquo(y))) { data %>% ggplot(aes(x = {{ x }})) + geom_bar() } else { data %>% ggplot(aes(y = {{ y }})) + geom_bar() } }
测试验证
- 调用
my_func(iris, x = Species):正常生成以Species为x轴的柱状图 - 调用
my_func(iris, y = Sepal.Length):正常生成以Sepal.Length为y轴的柱状图 - 调用
my_func(iris):触发错误提示"xandycannot both be missing."
内容的提问来源于stack exchange,提问作者mfg3z0
相关产品推荐
相关产品推荐

