r - 更新 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 元素都能正常工作。我将非常感谢任何为解决我的问题做出贡献的人。我正在寻找这方面的任何帮助。
提前致谢。
解决方案
这不是使用 来回答您的任务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)
推荐阅读
- java - 如何解决“无法解决变量问题”
- java - Spring JMS MappingJackson2MessageConverter - 无法处理错误
- c# - 让用户选择对象的名称
- php - 我可以在 PHP 中以“\n”开头的变量中添加双引号吗?
- javascript - React Native,如何将嵌套的 if else 转换为 switch 语句?
- python - Plotly:如何使用 go.Figure 和 go.Scatter 为每个 y 误差条设置单独的颜色?
- python - 如何让敌人在屏幕上移动
- javascript - 如何在逗号之前分隔字符串中的数字并推入数组
- javascript - 将 HTML 代码中的链接模式与 RegEx 匹配
- python - 在各种迭代中选择最佳性能模型