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

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
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:59:05