使用下拉菜单和操作按钮触发和观察Event()或eventReactive()

f45qwnt8  于 2023-02-01  发布在  React
关注(0)|答案(1)|浏览(101)

我正在构建一个应用程序,有些部分比其他部分需要更多的计算资源。我有一个单独的侧边栏,所有的控件都在那里。它包含一个下拉菜单和一个应用按钮。
我想只执行一些分析,如果下拉菜单,然后点击操作按钮。即两个条件需要为真,以执行代码。
应用程序

#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
#    http://shiny.rstudio.com/
#

library(shiny)

# Define UI for application that draws a histogram
ui <- fluidPage(

    # Application title
    titlePanel("Old Faithful Geyser Data"),

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
          shinyWidgets::pickerInput(
            inputId = "counterFactual",
            label = h4("Select an Analysis"),
            choices = c("A", "B", "C", "D"),
            selected = "A"
          ),
          actionButton(inputId = "apply", label = "Apply", icon = icon("play"))
        ),

        # Show a plot of the generated distribution
        mainPanel(
           plotOutput("distPlot")
        )
    )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

  
  event_trigger <- reactive({
    list(input$counterFactual, input$apply)
  })
  
  observeEvent(ignoreInit = TRUE, event_trigger(),
               {
                 if(event_triger()[[1]] == "C" && event_triger()[[2]] == TRUE)
                   print('Hello World')
               })
  
}

# Run the application 
shinyApp(ui = ui, server = server)
14ifxucb

14ifxucb1#

    • 简短答复:**

在这种特定情况下(即下拉列表必须真实(参见shiny::isTruthy(),需要点击按钮),您可以使用:

library(shiny)

# Define UI for application that draws a histogram
ui <- fluidPage(
  
  # Application title
  titlePanel("Old Faithful Geyser Data"),
  
  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(
      shinyWidgets::pickerInput(
        inputId = "counterFactual",
        label = h4("Select an Analysis"),
        choices = c("A", "B", "C", "D"),
        selected = "A"
      ),
      actionButton(inputId = "apply", label = "Apply", icon = icon("play"))
    ),
    
    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("distPlot")
    )
  )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
  
  
  observeEvent(ignoreInit = TRUE, input$apply,
               {
                 req(input$counterFactual)
                   print('Hello World')
               })
  
}

# Run the application 
shinyApp(ui = ui, server = server)

检查服务器部分-我已经删除了React,现在我们观察按钮和继续(功能shiny::req())只有当下拉是真实的(而不是""在我们的情况下)。

    • 更多评论**

我不明白:

event_triger()[[1]] == "CF1"

为什么它可以等于"CF1",如果这个输入只能是一个字母A-D?所以在你的情况下,Hello World根本不会被打印。
还有:

if(event_triger()[[1]] == "CF1" && event_triger()[[2]] == TRUE)

类型-event_triger而不是event_trigger
以及:
您不想检查按钮是否为TRUE-在第一次使用后,它将始终为TRUE(因为这是一个从0开始计数的计数器,只有0将为FALSE,所以只有在会话中从未使用过时,它才会为FALSE
如果这一点不明显:
您在observeEvent()中使用print(),因此Hello World将在控制台中打印,而不是应用程序(对于应用程序,您将需要renderText)。

相关问题