You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R编写plotly绘图函数报Quosures准引用上下文错误求助

问题原因
  • 先对传入的z执行as_name(z)转成字符串后,又用enquo(z)对字符串做捕获,逻辑完全冲突
  • plotly的参数环境不支持tidyverse的!!准引用语法,只有dplyr、tidyr等tidyverse生态函数原生支持该语法,直接在plotly参数里用!!就会触发quosure报错
  • 原代码里混用了dplyr已经废弃的下划线后缀函数(select_/arrange_),也存在兼容性风险
修正后可运行代码
f4 <- function(z){
  require("dplyr")
  require("tidyr")
  require("plotly")

  # 直接保留z为传入的字符串参数,不需要转quosure
  plt <- mtcars %>% 
    select(disp, hp, mpg, all_of(z)) %>% 
    group_by(across(all_of(c("mpg", z)))) %>%
    summarise(across(everything(), sum), .groups = "drop") %>%
    arrange(mpg)

  plt1 <- plt %>% 
    pivot_longer(cols = c(disp, hp), names_to = "variable", values_to = "Monto") %>%
    mutate(catvar = paste(mpg, variable, sep = '_'))
  
  # 把颜色字段转成plotly能识别的公式格式
  color_formula <- as.formula(paste0("~", z))
  # 拼接hover文本公式,把z对应的字段嵌入
  text_formula <- as.formula(
    paste0("~paste(catvar, '\\n Monto:', Monto, 'MM USD \\n ', ", z, ")")
  )
  
  fig <- plot_ly(plt1)
  fig <- fig %>% add_trace(
    x = ~catvar, 
    y = ~Monto, 
    color = color_formula,
    type = 'bar', 
    colors = 'BrBG',
    showlegend = TRUE,
    hoverinfo = "text",
    text = text_formula
  ) %>%
    layout(
      barmode = "stack",
      xaxis = list(title = ""),
      yaxis = list(
        title='MM de USD', 
        rangemode='tozero',
        side = 'left',
        showgrid = FALSE, 
        zeroline = FALSE
      )
    )
  
  return(fig)
}

# 调用测试可正常出堆叠柱状图,颜色按carb字段映射
f4('carb')
核心修改点
  • 删掉了逻辑冲突的as_name()、enquo()调用,直接用传入的字符串参数构造plotly支持的公式对象
  • 替换了dplyr废弃的下划线后缀函数为当前版本标准语法,兼容性更好
  • 把color、text参数的动态字段都转成as.formula生成的公式对象,不需要用准引用语法,适配plotly的参数规则
  • 删掉了yaxis配置里重复的overlaying和重复的title定义,避免配置冲突

内容的提问来源于stack exchange,提问作者Daniela saba rosner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 02:45:00