【问题标题】:Update reactive object with two actionbuttons in a shiny app在闪亮的应用程序中使用两个操作按钮更新反应对象
【发布时间】:2020-12-28 23:16:27
【问题描述】:

我有下面的闪亮应用程序,用户在其中上传文件(这里我只是将 dt 放入反应函数中),然后他可以从那里通过pickerInput() 选择他想显示为selectInput() 的列。然后他应该可以点击Update并查看表格。

用户还应该能够通过将所有numericInput() 乘以value1 来更新value1 值,并创建一个新的sliderInput(),从而更新表中显示的数据框。仅当用户单击Update2 操作按钮时才应应用这些更改。

问题是数据框基本上应该受到 2 个操作按钮的影响,我不确定是否可以应用。 Update2 仅在使用 numericInput() value1 时有效。

library(shiny)
library(shinyWidgets)
library(DT)
# ui object

ui <- fluidPage(
    titlePanel(p("Spatial app", style = "color:#3474A7")),
    sidebarLayout(
        sidebarPanel(
            uiOutput("inputp1"),
            #Add the output for new pickers
            uiOutput("pickers"),
            actionButton("button", "Update")
        ),
        
        mainPanel(
            DTOutput("table"),
            numericInput("num", label = ("value"), value = 1),
            actionButton("button2", "Update 2")
            
        )
    )
)

# server()
server <- function(input, output, session) {
    DF1 <- reactiveValues(data=NULL)
    
    dt <- reactive({
        name<-c("John","Jack","Bill")
        value1<-c(2,4,6)
        dt<-data.frame(name,value1)
    })
    
    observe({
        DF1$data <- dt()
    })
    
    output$inputp1 <- renderUI({
        pickerInput(
            inputId = "p1",
            label = "Select Column headers",
            choices = colnames( dt()),
            multiple = TRUE,
            options = list(`actions-box` = TRUE)
        )
    })
    
    observeEvent(input$p1, {
        #Create the new pickers
        output$pickers<-renderUI({
            dt1 <- DF1$data
            div(lapply(input$p1, function(x){
                if (is.numeric(dt1[[x]])) {
                    sliderInput(inputId=x, label=x, min=min(dt1[[x]]), max=max(dt1[[x]]), value=c(min(dt1[[x]]),max(dt1[[x]])))
                }else { # if (is.factor(dt1[[x]])) {
                    selectInput(
                        inputId = x,       # The col name of selected column
                        label = x,         # The col label of selected column
                        choices = dt1[,x], # all rows of selected column
                        multiple = TRUE
                    )
                }
                
            }))
        })
    })
    
    
    dt2 <- eventReactive(input$button, {
        req(input$num)
        dt <- DF1$data ## here you can provide the user input data read inside this observeEvent or recently modified data DF1$data
        dt$value1<-dt$value1*isolate(input$num)
        
        dt
    })
    observe({DF1$data <- dt2()})
    
    output_table <- reactive({
        req(input$p1, sapply(input$p1, function(x) input[[x]]))
        dt_part <- dt2()
        for (colname in input$p1) {
            if (is.factor(dt_part[[colname]]) && !is.null(input[[colname]])) {
                dt_part <- subset(dt_part, dt_part[[colname]] %in% input[[colname]])
            } else {
                if (!is.null(input[[colname]][[1]])) {
                    dt_part <- subset(dt_part, (dt_part[[colname]] >= input[[colname]][[1]]) & dt_part[[colname]] <= input[[colname]][[2]])
                }
            }
        }
        dt_part
    })
    
    output$table<-renderDT({
        output_table()
    })
    
}

# shinyApp()
shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    有时,我不清楚您是指 value1 作为数据框中的变量名还是 numericInput 值。也许您正在寻找这个。

    library(shiny)
    library(shinyWidgets)
    library(DT)
    # ui object
    
    ui <- fluidPage(
      titlePanel(p("Spatial app", style = "color:#3474A7")),
      sidebarLayout(
        sidebarPanel(
          uiOutput("inputp1"),
          #Add the output for new pickers
          actionButton("button", "Update"),
          uiOutput("pickers"),
          numericInput("num", label = ("value"), value = 1),
          actionButton("button2", "Update 2")
        ),
        
        mainPanel(
          DTOutput("table")
         
          
        )
      )
    )
    
    # server()
    server <- function(input, output, session) {
      DF1 <- reactiveValues(data=NULL)
      
      dt <- reactive({
        name<-c("John","Jack","Bill")
        value1<-c(2,4,6)
        dt<-data.frame(name,value1)
      })
      
      observe({
        DF1$data <- dt()
      })
      
      output$inputp1 <- renderUI({
        pickerInput(
          inputId = "p1",
          label = "Select Column headers",
          choices = colnames( dt()),
          multiple = TRUE,
          options = list(`actions-box` = TRUE)
        )
      })
      
      observeEvent(input$p1, {
        #Create the new pickers
        output$pickers<-renderUI({
          dt1 <- DF1$data
          div(lapply(input$p1, function(x){
            if (is.numeric(dt1[[x]])) {
              sliderInput(inputId=x, label=x, min=min(dt1[[x]]), max=max(dt1[[x]]), value=c(min(dt1[[x]]),max(dt1[[x]])))
            }else { # if (is.factor(dt1[[x]])) {
              selectInput(
                inputId = x,       # The col name of selected column
                label = x,         # The col label of selected column
                choices = dt1[,x], # all rows of selected column
                multiple = TRUE
              )
            }
            
          }))
        })
      })
      
      
      dt2 <- eventReactive(input$button2, {
        req(input$num)
        dt <- DF1$data ## here you can provide the user input data read inside this observeEvent or recently modified data DF1$data
        dt$value1<-dt$value1*isolate(input$num)
        
        dt
      })
      observe({DF1$data <- dt2()})
      
      output_table <- reactive({
        req(input$p1, sapply(input$p1, function(x) input[[x]]))
        dt_part <- dt2()
        for (colname in input$p1) {
          if (is.factor(dt_part[[colname]]) && !is.null(input[[colname]])) {
            dt_part <- subset(dt_part, dt_part[[colname]] %in% input[[colname]])
          } else {
            if (!is.null(input[[colname]][[1]])) {
              dt_part <- subset(dt_part, (dt_part[[colname]] >= input[[colname]][[1]]) & dt_part[[colname]] <= input[[colname]][[2]])
            }
          }
        }
        dt_part
      })
      
      output$table<-renderDT({
        if (input$button | input$button2) {
          DF1$data
        }else return(NULL)
      })
      
    }
    
    # shinyApp()
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    猜你喜欢
    • 2020-09-05
    • 2019-05-02
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2017-07-03
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多