ggtern 自定义函数对象 x 未找到错误

Posted

技术标签:

【中文标题】ggtern 自定义函数对象 x 未找到错误【英文标题】:ggtern custom function object x not found error 【发布时间】:2022-01-16 15:05:57 【问题描述】:

我正在尝试使用包 ggtern 创建一个绘制三元图的自定义函数

这里是数据和函数的例子

library(tidyverse)
library(ggtern)

myData <- tibble(T_x = c(0.461, 0.778, 0.429),
             T_y = c(0.126, 0.108, 0.404),
             T_z = c(0.413, 0.114, 0.167))

drawTriad <- function(df, x, y, z) 
  x <- enquo(x)
  y <- enquo(y)
  z <- enquo(z)
  df %>% 
    ggtern::ggtern(aes(!!x,
                       !!y,
                       !!z)) +
    geom_point(size = 2, color = "blue") +
    theme_void() + 
    theme_hidelabels() +
    theme(tern.axis.line = element_line(color='darkgray',size=1.5))

当我像这样在 myData 上运行函数时:

drawTriad(myData, T_x, T_y, T_z)

我收到以下错误:FUN(X[[i]], ...) 中的错误:找不到对象“x”

我怎样才能让这个简单的功能发挥作用?

【问题讨论】:

没人????????? 【参考方案1】:

几个选项...

library(ggplot2)
library(magrittr)
library(tibble)
library(ggtern)

选项 1

这更简单:只需重命名源数据框或 tibble 中的变量以适应 ggtern,这避免了点坐标的编程变量问题。

drawTriad <- function(df) 
  df %>% 
    ggtern::ggtern(aes(x, y, z)) +
    geom_point(size = 2, color = "blue") +
    theme_void() + 
    theme_hidelabels() +
    theme(tern.axis.line = element_line(color='darkgray',size=1.5))


drawTriad(myData)

选项 2

这是基于 ggplot2 中给出的解释:用于数据分析的优雅图形https://ggplot2-book.org/programming.html。并且匹配问题中提出的问题。

drawTriad <- function(df, x, y, z) 

  df %>% 
    ggtern::ggtern(aes_(x = as.name(x), y = as.name(y), z = as.name(z))) +
    geom_point(size = 2, color = "blue") +
    theme_void() + 
    theme_hidelabels() +
    theme(tern.axis.line = element_line(color='darkgray',size=1.5))


drawTriad(df = myData,
          x = "T_x",
          y = "T_y",
          z = "T_z")

由reprex package (v2.0.1) 于 2021 年 12 月 13 日创建

【讨论】:

谢谢@Peter!这行得通!为什么 enquo() 和 !!但在这种情况下不起作用? 来自 ggplot 书:“aes() 使用非标准评估:而不是查看其参数的值,而是查看它们的表达式。这使得以编程方式处理变得困难,因为没有办法将变量的名称存储在对象中,然后稍后引用它:”因此使用 aes_(),它使用常规评估。简而言之,它不同于以编程方式使用 dplyr

以上是关于ggtern 自定义函数对象 x 未找到错误的主要内容,如果未能解决你的问题,请参考以下文章

django admin 自定义模板页面未找到错误

自定义模块:未捕获类型错误:未定义不是函数

自定义管理命令在虚拟环境中抛出未找到模块错误

未找到具有自定义分页 404 的自定义分类和自定义帖子类型

未找到 Laravel 5.8 自定义命令

动作必须是普通对象。使用自定义中间件进行异步操作/未定义不是对象/使用 navigator.geolocation 出现错误