使用多个触发器更新 shiny R 中的 reactiveValues
Update reactiveValues in shiny R with multiple triggers
我正在尝试将 esquisse 集成到应用程序中。目前我有一个允许用户过滤一些数据的应用程序,我想将该数据传递给 esquisse。 Esquisse 将 reactiveValues 作为输入,通常使用 observeEvent 进行更新。但是,我不确定如何在此处使用 observeEvent,因为当许多不同的过滤器发生变化时数据会更新。有没有办法在每次数据更改时更新值?
示例应用:
library(shiny)
library(esquisse)
ui <- fluidPage(
titlePanel("Use esquisse as a Shiny module"),
mainPanel(
tabsetPanel(
tabPanel(
mainPanel(
selectInput(
inputId = "am",
label = "am:",
choices = c(0,1)
),
selectInput(
inputId = "gear",
label = "gear:",
choices = c(3,4,5)
),
selectInput(
inputId = "carb",
label = "carb:",
choices = c(1,2,3,4,6,8)
)
)),
tabPanel(
title = "esquisse",
esquisserUI(
id = "esquisse",
header = FALSE, # dont display gadget title
choose_data = FALSE # dont display button to change data
)
)
)
)
)
server <- function(input, output, session) {
data_r <- reactiveValues(data = data.frame(), name = "empty")
data <- reactive({
mtcars %>%
filter(am == input$am,
gear == input$gear,
carb == input$carb
)
})
data_r$data <- reactive({data()}) ### this doesn't work, so need something similar to this
callModule(
module = esquisserServer,
id = "esquisse",
data = data_r)
}
shinyApp(ui, server)
如果您仔细阅读 here 中的示例(我假设您已经阅读了),您可能会发现没有使用 reactive(...)
部分。要修复您的服务器部分,请使用(如示例中所示)reactiveValue
和 observeEvent
的组合。
使用reactiveValue
,初始化一个名为data_r
的默认变量。要更新变量,observeEvent
观察输入参数 am
、gear
或 carb
并在输入参数之一发生变化时更改 data_r
。
您的服务器函数可能如下所示:
server <- function(input, output, session) {
# initialize data_r
data_r <- reactiveValues(data = data.frame(), name = "empty")
# reactive filter for data_r on events am, gear and carb
observeEvent(
{input$am
input$gear
input$carb
1}, # last object not NULL needed here!
{am_filter <- input$am
gear_filter <- input$gear
carb_filter <- input$carb
data_r$data <- iris %>%
filter(Sepal.Length == am_filter,
Sepal.Width == gear_filter,
Petal.Length == carb_filter)}
)
callModule(module = esquisserServer, id = "esquisse", data = data_r)
}
提到 iris
数据集没有列 am
、gear
或 carb
!上述服务器示例的提议,是运行您示例中的服务器功能。
我正在尝试将 esquisse 集成到应用程序中。目前我有一个允许用户过滤一些数据的应用程序,我想将该数据传递给 esquisse。 Esquisse 将 reactiveValues 作为输入,通常使用 observeEvent 进行更新。但是,我不确定如何在此处使用 observeEvent,因为当许多不同的过滤器发生变化时数据会更新。有没有办法在每次数据更改时更新值?
示例应用:
library(shiny)
library(esquisse)
ui <- fluidPage(
titlePanel("Use esquisse as a Shiny module"),
mainPanel(
tabsetPanel(
tabPanel(
mainPanel(
selectInput(
inputId = "am",
label = "am:",
choices = c(0,1)
),
selectInput(
inputId = "gear",
label = "gear:",
choices = c(3,4,5)
),
selectInput(
inputId = "carb",
label = "carb:",
choices = c(1,2,3,4,6,8)
)
)),
tabPanel(
title = "esquisse",
esquisserUI(
id = "esquisse",
header = FALSE, # dont display gadget title
choose_data = FALSE # dont display button to change data
)
)
)
)
)
server <- function(input, output, session) {
data_r <- reactiveValues(data = data.frame(), name = "empty")
data <- reactive({
mtcars %>%
filter(am == input$am,
gear == input$gear,
carb == input$carb
)
})
data_r$data <- reactive({data()}) ### this doesn't work, so need something similar to this
callModule(
module = esquisserServer,
id = "esquisse",
data = data_r)
}
shinyApp(ui, server)
如果您仔细阅读 here 中的示例(我假设您已经阅读了),您可能会发现没有使用 reactive(...)
部分。要修复您的服务器部分,请使用(如示例中所示)reactiveValue
和 observeEvent
的组合。
使用reactiveValue
,初始化一个名为data_r
的默认变量。要更新变量,observeEvent
观察输入参数 am
、gear
或 carb
并在输入参数之一发生变化时更改 data_r
。
您的服务器函数可能如下所示:
server <- function(input, output, session) {
# initialize data_r
data_r <- reactiveValues(data = data.frame(), name = "empty")
# reactive filter for data_r on events am, gear and carb
observeEvent(
{input$am
input$gear
input$carb
1}, # last object not NULL needed here!
{am_filter <- input$am
gear_filter <- input$gear
carb_filter <- input$carb
data_r$data <- iris %>%
filter(Sepal.Length == am_filter,
Sepal.Width == gear_filter,
Petal.Length == carb_filter)}
)
callModule(module = esquisserServer, id = "esquisse", data = data_r)
}
提到 iris
数据集没有列 am
、gear
或 carb
!上述服务器示例的提议,是运行您示例中的服务器功能。