如何从 Rmarkdown 部分重构 Shiny 代码的服务器部分
How to refactor server part of Shiny code from Rmarkdown sections
我有以下完整的 运行 Shiny-dashboard 应用程序:
---
title: "Test"
runtime: shiny
output:
flexdashboard::flex_dashboard:
orientation: rows
theme: bootstrap
vertical_layout: scroll
---
```{r setup, include=FALSE}
library(flexdashboard)
library(tidyverse)
```
Basic
=====================================
Inputs_basic {.sidebar}
-------------------------------------
```{r io_processes}
selectInput("mpg_thres", label = "MPG threshold",
choices = c(10,20,30,40), selected = 10)
selectInput("cyl_thres", label = "CYL threshold",
choices = c(4,5,6,7,8), selected = 4)
```
Rows {data-height=500}
-------------------------------------
### Scatter Plot
```{r show_scattr}
mainPanel(
renderPlot( {
dat <- as.tibble(mtcars) %>%
select(mpg, cyl) %>%
filter(mpg > input$mpg_thres & cyl > input$cyl_thres)
ggplot(dat, aes(mpg, cyl)) +
geom_point()
})
)
```
Rows {data-height=500}
-------------------------------------
### Show verbatim
```{r show_verbatim}
mainPanel(
renderPrint( {
dat <- as.tibble(mtcars) %>%
select(mpg, cyl) %>%
filter(mpg > input$mpg_thres & cyl > input$cyl_thres)
dat
})
)
```
注意以下部分代码是多余的
在两个不同的 Rmarkdown 部分中 散点图 和 逐字显示.
dat <- as.tibble(mtcars) %>%
select(mpg, cyl) %>%
filter(mpg > input$mpg_thres & cyl > input$cyl_thres)
如何分解它?
为了完整起见,应用程序的屏幕截图是这样的:
使用反应式数据表达式,将输出块更改为:
### Scatter Plot
```{r show_scattr}
dat <- reactive( {
as.tibble(mtcars) %>%
select(mpg, cyl) %>%
filter(mpg > input$mpg_thres & cyl > input$cyl_thres)
} )
mainPanel(
renderPlot( {
ggplot(dat(), aes(mpg, cyl)) +
geom_point()
})
)
```
### Show verbatim
```{r show_verbatim}
mainPanel(
renderPrint( {
dat()
})
)
```
注意 reactive
的使用以及将 dat
作为函数调用 (dat()
)。
reactive
确保每次更改输入时,都会重新计算 dat
。
我有以下完整的 运行 Shiny-dashboard 应用程序:
---
title: "Test"
runtime: shiny
output:
flexdashboard::flex_dashboard:
orientation: rows
theme: bootstrap
vertical_layout: scroll
---
```{r setup, include=FALSE}
library(flexdashboard)
library(tidyverse)
```
Basic
=====================================
Inputs_basic {.sidebar}
-------------------------------------
```{r io_processes}
selectInput("mpg_thres", label = "MPG threshold",
choices = c(10,20,30,40), selected = 10)
selectInput("cyl_thres", label = "CYL threshold",
choices = c(4,5,6,7,8), selected = 4)
```
Rows {data-height=500}
-------------------------------------
### Scatter Plot
```{r show_scattr}
mainPanel(
renderPlot( {
dat <- as.tibble(mtcars) %>%
select(mpg, cyl) %>%
filter(mpg > input$mpg_thres & cyl > input$cyl_thres)
ggplot(dat, aes(mpg, cyl)) +
geom_point()
})
)
```
Rows {data-height=500}
-------------------------------------
### Show verbatim
```{r show_verbatim}
mainPanel(
renderPrint( {
dat <- as.tibble(mtcars) %>%
select(mpg, cyl) %>%
filter(mpg > input$mpg_thres & cyl > input$cyl_thres)
dat
})
)
```
注意以下部分代码是多余的 在两个不同的 Rmarkdown 部分中 散点图 和 逐字显示.
dat <- as.tibble(mtcars) %>%
select(mpg, cyl) %>%
filter(mpg > input$mpg_thres & cyl > input$cyl_thres)
如何分解它?
为了完整起见,应用程序的屏幕截图是这样的:
使用反应式数据表达式,将输出块更改为:
### Scatter Plot
```{r show_scattr}
dat <- reactive( {
as.tibble(mtcars) %>%
select(mpg, cyl) %>%
filter(mpg > input$mpg_thres & cyl > input$cyl_thres)
} )
mainPanel(
renderPlot( {
ggplot(dat(), aes(mpg, cyl)) +
geom_point()
})
)
```
### Show verbatim
```{r show_verbatim}
mainPanel(
renderPrint( {
dat()
})
)
```
注意 reactive
的使用以及将 dat
作为函数调用 (dat()
)。
reactive
确保每次更改输入时,都会重新计算 dat
。