ggplot2含空格变量名传入与tidyeval语法使用问题求解
问题原因
- aes()中直接传入存储列名的字符串变量
xVariable时,ggplot2会将其识别为全局固定字符串常量,而非数据框的列映射,导致所有样本的x轴坐标完全相同 - 对
yVariable调用enquo()的用法不符合场景:enquo()用于捕获函数调用时传入的未求值裸表达式,而你当前的yVariable是提前赋值的字符串变量,enquo(yVariable)捕获后解引用得到的依然是字符串常量,无法匹配数据框列
修正代码
如果你是通过字符串变量传递列名(适配用户传入字符串列名的需求),使用.data代词提取对应列即可:
library(ggplot2) weather <- data.frame(Month = month.name[1:5], `Low Temperature` = 20:16, `High Temperature` = seq(30, 22, -2), check.names = FALSE) xVariable <- "Month" yVariable <- "High Temperature" ggplot(weather, aes(x = .data[[xVariable]], y = .data[[yVariable]])) + geom_point()
如果你要封装的函数支持用户直接传入裸列名(无需加引号),可以按以下写法实现:
library(ggplot2) library(rlang) # 绘图函数封装 temp_plot <- function(data, x_col, y_col) { x_col <- enquo(x_col) y_col <- enquo(y_col) ggplot(data, aes(x = !!x_col, y = !!y_col)) + geom_point() } # 调用测试 weather <- data.frame(Month = month.name[1:5], `Low Temperature` = 20:16, `High Temperature` = seq(30, 22, -2), check.names = FALSE) temp_plot(weather, Month, `High Temperature`)
内容的提问来源于stack exchange,提问作者Dario
相关产品推荐
相关产品推荐

