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
相关产品推荐
相关产品推荐

