作为一个最小可行的示例,我从这里模块化了基本示例:https ://rmarkdown.rstudio.com/flexdashboard/shiny.html#simple_example
代码片段(复制粘贴,.Rmd
在 RStudio 中运行应该可以解决问题):
---
title: "stackoverflow example"
output: flexdashboard::flex_dashboard
runtime: shiny
---
```{r global, include=FALSE}
library(shiny)
library(flexdashboard) # install.packages("flexdashboard")
# load data in 'global' chunk so it can be shared by all users of the dashboard
library(datasets)
data(faithful)
# UI modules
sidebarCharts <- function(id) {
ns <- NS(id)
tagList(
p(),
actionButton(ns("settings"), "Settings", icon = icon("cogs"), width = '100%', class = "btn btn-info"),p(),
actionButton(ns("refreshMainChart") ,"Refresh", icon("refresh"), width = '100%', class = "btn btn-primary"),p()
,textOutput(ns("info")) # FOR DEBUGGING
)
}
mainChartUI <- function(id) {
ns <- NS(id)
plotOutput(ns("mainChart"), width = "100%")
}
# UI module for the 2 buttons in the modal:
modalFooterUI <- function(id) {
ns <- NS(id)
tagList(
modalButton("Cancel", icon("remove")),
actionButton(ns("modalApply"), "Apply", icon = icon("check"))
)
}
server <- function(input, output, session) {
# Init reactiveValues() to store values & debug info; https://github.com/rstudio/shiny/issues/1588
rv <- reactiveValues(clicks = 0, applyClicks = 0,
bins = 20,
bandwidth = 1)
# DEBUGGING
output$info <- renderText({
paste("You clicked the 'Settings' button", rv$clicks, "times. You clicked the 'Apply' button", rv$applyClicks, "times. The bin size is currently set to", rv$bins, "and the bandwidth is currently set to", rv$bandwidth)
})
settngsModal <- function(id) {
ns <- NS(id)
modalDialog(
withTags({ # UI elements for the modal go in here
fluidRow(
column(4, "Inputs",
selectInput(ns("n_breaks"), label = "Number of bins:", choices = c(10, 20, 35, 50), selected = rv$bins, width = '100%')),
column(4, "Go",
sliderInput(ns("bw_adjust"), label = "Bandwidth adjustment:", min = 0.2, max = 2, value = rv$bandwidth, step = 0.2, width = '100%')),
column(4, "Here")
)
}),
title = "Settings",
footer = modalFooterUI("inputs"),
size = "l",
easyClose = FALSE,
fade = TRUE)
}
# Sidebar 'Settings' modal
observeEvent(input$settings, {
showModal(settngsModal("inputs")) # This opens the modal; settngsModal() defined below
rv$clicks <- rv$clicks + 1 # FOR DEBUGGING
})
observeEvent(input$modalApply, {
rv$applyClicks <- rv$applyClicks + 1 # FOR DEBUGGING
rv$bins <- input$n_breaks # This is where I set the reactiveValues() to those inputted into the modal.
rv$bandwith <- input$bw_adjust
removeModal() # This should dismiss the modal (but it doesn't seem to work)
})
output$mainChart <- renderPlot({
input$refreshMainChart # Take dependency on the 'Refresh' buton
hist(faithful$eruptions, probability = TRUE, breaks = as.numeric(rv$bins),
xlab = "Duration (minutes)", main = "Geyser Eruption Duration")
dens <- density(faithful$eruptions, adjust = rv$bandwidth)
lines(dens, col = "blue")
})
}
```
Column {.sidebar}
-----------------------------------------------------------------------
```{r}
callModule(server, "main")
sidebarCharts("main")
```
Column
-----------------------------------------------------------------------
### Main chart goes here
```{r}
mainChartUI("main")
```
截图:
这是所需的功能:
rv
在应用程序启动时,图表应使用存储在其中的 bin 大小和带宽的默认参数呈现reactiveValues()
-这似乎有效。- 当我第一次单击模态时,它应该会出现 bin-size 和带宽的默认参数——这似乎也有效。
- 当我更新任一输入参数并单击“应用”时,它应该关闭模态并随后将对象内的相应参数设置为
rv
reactiveValues()
选定的参数——这不起作用(模态都不会关闭,也不会被关闭reactiveValues
)更新)。 - 在
reactiveValues()
内部rv
用新的更新后,图表不应该重新渲染,直到用户点击“刷新”actionButton
——这也不起作用,但取决于上面的 (3)。
我究竟做错了什么??感觉就像我忽略了一些超级简单的事情。
谢谢!!