Shiny文档中实现Grobs并排显示并绑定滑块输入值的问题求助
解决方案
你的问题出在renderPlot()的执行逻辑上:R会将函数体内最后一行代码的结果作为绘图输出,所以之前的g3和connectGrob的结果都被忽略了,只显示了最后一个g4。要同时显示两个盒子和连接箭头,我们需要显式地把所有grobs绘制到绘图设备中。
修改后的完整代码
--- runtime: shiny output: html_document --- ```{r global-options, include = FALSE} ## set global options knitr::opts_chunk$set(echo = F, error = F, warning = F, message = F)
## libraries library(shiny) library(Gmisc) library(grid) library(knitr) ## slider input sliderInput("nSelect", "Select N:", min = 1, max = 10, value = 5)
## output grobs normally, but no way to use reactive slider values g1 <- boxGrob(5, x = 0.3, y = 0.5) g2 <- boxGrob(5, x = 0.8, y = 0.5) g1 g2 connectGrob(g1, g2, type = "horizontal")
## 修复后的反应式输出:同时显示两个grobs和连接箭头 renderPlot({ # 根据滑块输入创建boxGrobs g3 <- boxGrob(input$nSelect, x = 0.3, y = 0.5) g4 <- boxGrob(input$nSelect, x = 0.8, y = 0.5) # 创建连接箭头 conn_grob <- connectGrob(g3, g4, type = "horizontal") # 初始化新的绘图页面 grid.newpage() # 依次绘制所有grobs grid.draw(g3) grid.draw(g4) grid.draw(conn_grob) })
### 关键说明 1. **显式绘制所有元素**:使用`grid.newpage()`初始化绘图设备,然后通过`grid.draw()`分别绘制两个盒子和连接箭头,确保所有元素都被渲染出来。 2. **响应式绑定**:`input$nSelect`可以正常传递到`boxGrob()`中,滑块值变化时,所有grobs会自动更新。 这样修改后,你就能同时看到两个显示滑块当前值的盒子,以及它们之间的水平连接箭头,并且会随着滑块的拖动实时更新内容。 内容的提问来源于stack exchange,提问作者DJC
相关产品推荐
相关产品推荐

