R自定义ggplot绘图函数报错:对象'Species'未找到问题求助
错误原因
- ggplot2的
aes()默认采用非标准求值机制,直接调用时你传入的裸列名会在传入的data变量的环境中检索,因此直接写ggplot(iris, aes(Species, Sepal.Length))可以正常运行。 - 你自定义函数中直接在
aes()内写形参x、y时,aes()不会自动将形参映射为你调用函数时传入的裸列名,会优先检索环境中名为x、y的对象,自然找不到对应列,因此抛出object 'Species' not found的错误。
修复方法
当前主流方案是使用ggplot2提供的embrace运算符{{ }}包裹形参,让aes()可以正确解析传入的裸列名,修正后代码如下:
# 可正常运行的自定义绘图函数 plotify <- function(data, x, y){ ggplot2::ggplot(data, ggplot2::aes(x = {{ x }}, y = {{ y }})) + ggplot2::geom_bar(stat = "identity") } # 调用测试 plotify(iris, Species, Sepal.Length)
如果使用的是3.0.0版本以下的旧版ggplot2,可使用已弃用的aes_string()实现相同效果,调用时需传入字符串格式的列名:
# 旧版本兼容方案 plotify <- function(data, x_col, y_col){ ggplot2::ggplot(data, ggplot2::aes_string(x = x_col, y = y_col)) + ggplot2::geom_bar(stat = "identity") } # 调用示例 plotify(iris, "Species", "Sepal.Length")
内容的提问来源于stack exchange,提问作者dancing_monkeys
相关产品推荐
相关产品推荐

