R/Shiny应用中pairs等绘图结果输出至RStudio面板而非Shiny UI问题排查
问题原因
你遇到的问题核心是两类绘图函数的运行逻辑差异:
vis_miss()属于ggplot2生态的绘图函数,执行后会返回一个ggplot绘图对象,你赋值给v$plot_data的时候不会直接触发绘图,只有当你显式调用该对象、或者在renderPlot中返回它的时候,才会在指定的绘图设备(也就是Shiny的plotOutput对应的设备)渲染。- 而
pairs()是R基础绘图系统的函数,它的设计逻辑是执行时直接在当前激活的绘图设备输出图形,没有可保存复用的绘图对象返回。你执行v$plot_data <- pairs(new_data())时,赋值操作的同时pairs就已经完成了绘图,此时如果Shiny的绘图设备没有被激活,就会默认输出到RStudio的本地绘图面板;且pairs返回值为NULL,你后续renderPlot里拿到的v$plot_data本身是空值,自然不会在Shiny UI输出内容。
解决方案
提供两种适配你现有逻辑的修改方案:
方案1:调整绘图触发逻辑,在renderPlot内直接执行绘图命令
不需要提前在observeEvent里存储绘图对象,改用响应式变量标记当前需要绘制的图形类型即可:
# 新增响应式变量记录绘图类型 v <- reactiveValues(plot_type = NULL, new_data = NULL) observeEvent(input$missing, { # 点击Missing按钮 v$plot_type <- "miss" }) observeEvent(input$pairs, { # 点击Pairs按钮 v$plot_type <- "pairs" }) output$plot_data <- renderPlot({ if (is.null(v$plot_type) || is.null(new_data())) return() if(v$plot_type == "miss"){ vis_miss(new_data()) } else if(v$plot_type == "pairs"){ pairs(new_data()) } })
方案2:改用ggplot生态的散点图矩阵函数
如果要保留你现有赋值存储绘图对象的逻辑,可以替换pairs()为GGally::ggpairs(),该函数返回ggplot对象,使用逻辑和vis_miss完全一致:
observeEvent(input$pairs, { v$plot_data <- GGally::ggpairs(new_data()) })
内容的提问来源于stack exchange,提问作者JRomeo
相关产品推荐
相关产品推荐

