并排 Grobs 不适用于 Shiny

问题描述

我想创建一个 Shiny 文档,其中显示两个并排的 grob,并希望每个 grob 内的文本是滑块输入的选定值。

我能够在非反应性上下文中轻松地并排输出两个 grob(下面的第一个示例),但显然无法提取滑块值。但是,当我尝试在 renderPlot 响应式上下文中输出它们时,我能够提取滑块值,但只有第二个 grob 出现并且连接箭头不可见。

谁能提供一个解决方案,同时显示 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)
```

```{r echo = F,message = F}
## libraries
library(shiny)
library(Gmisc)
library(grid)
library(knitr)

## slider input
sliderInput("nSelect","Select N:",min = 1,max = 10,value = 5)
```

```{r fig.width = 10,fig.height = 1}
## 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")
```

```{r fig.width = 10,fig.height = 1}
## output grobs using render plot (allows inputs)
renderPlot({
g3 <- BoxGrob(input$nSelect,y = 0.5)
g4 <- BoxGrob(input$nSelect,y = 0.5)
connectGrob(g3,g4,type = "horizontal")
g3
g4
})
```

enter image description here

解决方法

renderPlot 中,您需要显式调用 print(),即您需要做的就是:

renderPlot({
  g3 <- boxGrob(input$nSelect,x = 0.3,y = 0.5)
  g4 <- boxGrob(input$nSelect,x = 0.8,y = 0.5)
  print(connectGrob(g3,g4,type = "horizontal"))
  print(g3)
  print(g4)
})

这是一个 R 特性,表达式中的任何内容都不会打印,除非它是最后一个元素,也就是说,您可以省略 g4 的 print(),因为它只会作为最后一个元素被打印。

>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...