在 R Shiny 中,如何实现反应函数?
In R Shiny, how to implement a reactive function?
在下面的 MWE 代码中,我想更改场景数量的滑块输入,以响应地更改首次呈现的场景 1(在单击“添加场景”操作按钮之前)。一旦通过单击操作按钮(场景 2、3 等)添加了另一个场景,场景 1 将保持在滑块输入更改时的位置。底部显示的图像应该更好地解释:
- 图 1:首次调用应用程序时的默认视图。场景 1 是
自动生成的 10 个随机样本(样本数绘制在 x 轴上,随机数绘制在 y 轴上)。 10 是样本数的默认值。到目前为止一切顺利。
- 图 2:下一步:我将输入滑块移动到 6(没有触摸操作按钮),场景 1 保持在 10 个样本。 我希望场景 1 反应性地重新 运行 6 个样本,而不是默认的 10。
- 图 3:上述步骤之后的下一步:显示单击“添加场景”操作按钮时其他一切正常的情况。我移动滑块并根据输入滑块的值生成新场景。
(顺便说一句,不要担心此操作按钮会触发空白模式对话框——我需要它以备后用)。
任何人都可以帮助使滑块输入对场景 1 具有反应性吗?
请注意,在点击“添加场景”时,之前的滑块输入会正确地“凝胶”运行(不要更改)。
MWE 代码:
library(shiny)
library(tidyverse)
library(ggplot2)
ui <- fluidPage(
sliderInput('samples','Number of samples (X):',min=2,max=10,value=10),
actionButton("add", "Add scenario"),
plotOutput("plot"),
)
server <- function(input, output, session) {
v <- reactiveValues(results=tibble(Scenario=1, X=1:10, Y=runif(10)))
observeEvent(req(input$periods), {
v <- reactiveValues(results=tibble(Scenario=1,X=1:input$samples,Y=input$samples))
})
observeEvent(input$add, {showModal(modalDialog(footer = modalButton("Close")))
newData <- tibble(Scenario=max(v$results$Scenario)+1,X=1:input$samples,Y=runif(input$samples))
v$results <- v$results %>% bind_rows(newData)
})
output$plot <- renderPlot({
v$results %>% ggplot() + geom_line(aes(x=X, y=Y, colour=as.factor(Scenario)))
})
}
shinyApp(ui, server)
看看这是否有效。理想情况下,您应该使用 map_dfr 或类似的函数来生成标题。但是为了使代码易于理解,我只使用了一个 for 循环。
library(shiny)
library(tidyverse)
library(ggplot2)
ui <- fluidPage(
sliderInput('samples','Number of samples (X):',min=2,max=10,value=10),
actionButton("add", "Add scenario"),
plotOutput("plot"),
)
server <- function(input, output, session) {
numScenarios <- reactiveValues(numS=1)
observeEvent(input$add, {showModal(modalDialog(footer = modalButton("Close")))
numScenarios$numS <- (numScenarios$numS+1)
})
output$plot <- renderPlot({
v <- tibble()
for (i in 1: numScenarios$numS){
results=tibble(Scenario=i,X=1:input$samples,Y=runif(input$samples))
v <- bind_rows(v, results)
}
v %>% ggplot() + geom_line(aes(x=X, y=Y, colour=as.factor(Scenario)))
})
}
shinyApp(ui, server)
在下面的 MWE 代码中,我想更改场景数量的滑块输入,以响应地更改首次呈现的场景 1(在单击“添加场景”操作按钮之前)。一旦通过单击操作按钮(场景 2、3 等)添加了另一个场景,场景 1 将保持在滑块输入更改时的位置。底部显示的图像应该更好地解释:
- 图 1:首次调用应用程序时的默认视图。场景 1 是 自动生成的 10 个随机样本(样本数绘制在 x 轴上,随机数绘制在 y 轴上)。 10 是样本数的默认值。到目前为止一切顺利。
- 图 2:下一步:我将输入滑块移动到 6(没有触摸操作按钮),场景 1 保持在 10 个样本。 我希望场景 1 反应性地重新 运行 6 个样本,而不是默认的 10。
- 图 3:上述步骤之后的下一步:显示单击“添加场景”操作按钮时其他一切正常的情况。我移动滑块并根据输入滑块的值生成新场景。
(顺便说一句,不要担心此操作按钮会触发空白模式对话框——我需要它以备后用)。
任何人都可以帮助使滑块输入对场景 1 具有反应性吗?
请注意,在点击“添加场景”时,之前的滑块输入会正确地“凝胶”运行(不要更改)。
MWE 代码:
library(shiny)
library(tidyverse)
library(ggplot2)
ui <- fluidPage(
sliderInput('samples','Number of samples (X):',min=2,max=10,value=10),
actionButton("add", "Add scenario"),
plotOutput("plot"),
)
server <- function(input, output, session) {
v <- reactiveValues(results=tibble(Scenario=1, X=1:10, Y=runif(10)))
observeEvent(req(input$periods), {
v <- reactiveValues(results=tibble(Scenario=1,X=1:input$samples,Y=input$samples))
})
observeEvent(input$add, {showModal(modalDialog(footer = modalButton("Close")))
newData <- tibble(Scenario=max(v$results$Scenario)+1,X=1:input$samples,Y=runif(input$samples))
v$results <- v$results %>% bind_rows(newData)
})
output$plot <- renderPlot({
v$results %>% ggplot() + geom_line(aes(x=X, y=Y, colour=as.factor(Scenario)))
})
}
shinyApp(ui, server)
看看这是否有效。理想情况下,您应该使用 map_dfr 或类似的函数来生成标题。但是为了使代码易于理解,我只使用了一个 for 循环。
library(shiny)
library(tidyverse)
library(ggplot2)
ui <- fluidPage(
sliderInput('samples','Number of samples (X):',min=2,max=10,value=10),
actionButton("add", "Add scenario"),
plotOutput("plot"),
)
server <- function(input, output, session) {
numScenarios <- reactiveValues(numS=1)
observeEvent(input$add, {showModal(modalDialog(footer = modalButton("Close")))
numScenarios$numS <- (numScenarios$numS+1)
})
output$plot <- renderPlot({
v <- tibble()
for (i in 1: numScenarios$numS){
results=tibble(Scenario=i,X=1:input$samples,Y=runif(input$samples))
v <- bind_rows(v, results)
}
v %>% ggplot() + geom_line(aes(x=X, y=Y, colour=as.factor(Scenario)))
})
}
shinyApp(ui, server)