首页 > 解决方案 > 更新 InsertUI 元素

问题描述

假设我有一个如下所示的数据框,并且我使用插入 UI 元素创建了多个面板。在我的情况下,我如何更新这些多个面板中的值。

我可以更新第一个面板的输入,但是当我尝试更新其他添加的面板时,事情变得更加混乱。假设在一个面板中我需要 1985 年地震的数据,而在另一个面板中我需要 1990 年地震的数据。

我怎么做?对于第一个面板,它工作正常,我可以在 1985 年和 1990 年的数据之间切换,但是当我添加新面板时,更新在包括第一个面板在内的任何面板中都不会相应地工作。

此外,删除按钮的位置不会使用 CSS 命令左右改变,为什么?

感谢任何人的帮助,因为 R 对我来说有点困难。

这是我尝试处理但没有成功的代码

 # Demo dataframe

 DT <- data.frame(Year = c(1980,1985,1985,1990,1990,1995), Events = 
 c("Storm","Earthquake","Flood","Draught","Earthquake","Flood"), Area_Loss 
 = c(100, 200, 400, 500, 450,300), Money = 
 c(1000,2000,3000,4000,5000,6000))

 #UI Logic 

 ui <- fluidPage( h4("Updating InserUIs",
        inlineCSS("#delete_div{margin-top:1em;}"),
        selectInput("events","Events",choices = as.character(DT$Events)),
        tags$div(id = "Panels"),
        actionButton("add","Add")    
           ))


  #Server Logic 

  server <- function(session, input, output){

   vals <- reactiveValues(btn = 0)

     #Adding and Removing buttons 

   observeEvent(input$add,ignoreNULL = FALSE,{

        vals$btn <- vals$btn +1

   insertUI(

   selector = "#Panels",
   ui = splitLayout(id = paste0("Selection",vals$btn), where = "afterEnd",
                   cellWidths = rep("33.33%",3),

   selectInput(paste("year",vals$btn +1,sep = ""), "Year", choices = 
        as.numeric(DT$Year), selected = ""),
   numericInput(paste("area",vals$btn +1,sep = ""), "Area", min = 0, max = 
        10000, value ="", step = 1),
   numericInput(paste("money",vals$btn +1,sep = ""), "Money", min = 0, max 
        = 10000, value = "", step =1),
   div(id = "delete_div",actionButton(paste0("delete",vals$btn), 
         "Delete"))))

     observeEvent(input[[paste0("delete",vals$btn)]],{
        shiny::removeUI(selector = paste0("#Selection",vals$btn))
         vals$btn <- vals$btn - 1

   })
 })

     #For Updating the inserted UIs

      Year_Value <- reactive({
            Year <- c(input[["year"]])
              if(vals$btn>0){
                 for(i in 1:vals$btn){
               Year <- c(Year,input[[paste0("year", i+1)]])
                  }
             Year <- paste(Year,collapse = "\n")     
         }
      })

       #Updates based on Year and Events

   observeEvent(input$events,
    updateSelectInput(session,paste("year",vals$btn +1,sep = 
    ""),"Year", choices = as.numeric(DT$Year)[DT$Events == input$events], 
    selected = ""))

   observeEvent(Year_Value(),
    updateNumericInput(session,paste("area",vals$btn +1,sep = 
    ""),"Area",min= 0, max= 50000,value = DT$Area_Loss[DT$Year == 
    Year_Value() & DT$Events== input$events] ,step = 0.1))

   observeEvent(Year_Value(),
    updateNumericInput(session,paste("money",vals$btn +1,sep = 
    ""),"Money",min= 0, max= 50000,value = DT$Money[DT$Year == 
    Year_Value() & DT$Events == input$events],step = 0.1))

  }

   shinyApp(ui,server)

我希望我的更新对所有插入的 ui 元素都能正常工作。我将非常感谢任何为解决我的问题做出贡献的人。我正在寻找这方面的任何帮助。

提前致谢。

标签: rshiny

解决方案


这不是使用 来回答您的任务insertUI,而是更多地提出了另一种更容易实施的建议。您可以使用DT允许在闪亮的应用程序中编辑表格的包。查看此处的文档:https ://rstudio.github.io/DT/和此处的演示闪亮应用程序:https ://yihui.shinyapps.io/DT-edit/ 。使用您的数据的快速示例:

library(shiny)
library(DT)
# Demo dataframe

DT <- data.frame(
  Year = c(1980, 1985, 1985, 1990, 1990, 1995),
  Events =
    c(
      "Storm",
      "Earthquake",
      "Flood",
      "Draught",
      "Earthquake",
      "Flood"
    ),
  Area_Loss
  = c(100, 200, 400, 500, 450, 300),
  Money =
    c(1000, 2000, 3000, 4000, 5000, 6000)
)

ui <- basicPage(
  DTOutput("ee"),
  tags$hr(),
  h3("table after editing:"),
  tableOutput("edited")
)

server <- function(input, output) {
  output$ee <- renderDT({
    datatable(data = DT, editable = "row", filter = "top")
  })

  # edit a row
  observeEvent(input$ee_cell_edit, {
    DT <<- editData(data = DT, info = input$ee_cell_edit, 'ee')
    output$edited <- renderTable(DT)
  })
}

shinyApp(ui, server)

推荐阅读