ggplot2自定义函数列名识别失败,求解决方法
解决ggplot2函数列名识别问题
问题根源
你调用函数时传递的是裸变量名(Time、Zscore),但函数定义里的参数默认是字符串类型,R会试图在全局环境中寻找名为Time的对象而非将其识别为数据集的列名,因此报错。
解决方案
这里提供两种常用且可靠的方法:
方法1:字符串传参 + .data pronoun(推荐)
保持函数内用.data[[xvar]]的写法,调用时传入列名的字符串:
set.seed(123) MYdata1 <- data.frame(Time = 1:1000, Zscore = rnorm(1000)) plot_testassess <- function(data1, xvar = "Time", yvar = "Zscore"){ ggplot(data = data1, aes(.data[[xvar]], .data[[yvar]])) + geom_line() # 需添加几何图层,否则仅返回ggplot对象无法显示图形 } # 调用时传入字符串形式的列名 plot_testassess(MYdata1, "Time", "Zscore")
方法2:tidyeval语法({{}}),支持裸变量名传参
这是ggplot2官方推荐的函数编写方式,允许调用时直接传裸列名,更贴合tidyverse风格:
set.seed(123) MYdata1 <- data.frame(Time = 1:1000, Zscore = rnorm(1000)) plot_testassess <- function(data1, xvar = Time, yvar = Zscore){ ggplot(data = data1, aes({{xvar}}, {{yvar}})) + geom_line() } # 直接传裸列名即可 plot_testassess(MYdata1, Time, Zscore)
补充说明
aes_string已被ggplot2弃用,不建议继续使用;- 两种方法都需添加几何图层(如
geom_line()),否则函数仅返回ggplot对象,无法生成可视化图形。
内容的提问来源于stack exchange,提问作者Liptongal
相关产品推荐
相关产品推荐

