R 如何从数据表单元格单击中观察动态生成的UI?

R 如何从数据表单元格单击中观察动态生成的UI?,r,shiny,R,Shiny,要编辑一对多相似的数据结构 我想创建一个数据表(DTOutput),在该表上我观察单元格单击observeEvent(输入$groupingout\u cell\u clicked,{…}) 然后,每次单击单元格时,我都希望在UI上生成输入字段 最后,我想听听那些呈现/生成的UI上的更改 我不能直接在DTOutput中编辑这些单元格,因为它不支持单元格内的向量。(因此,一对多关系) 我已经完成了第1步和第2步。我可以使用相应的单元格渲染DTOutput。我可以观察单元格单击并在单元格单击时插入U

要编辑一对多相似的数据结构

  • 我想创建一个数据表(
    DTOutput
    ),在该表上我观察单元格单击
    observeEvent(输入$groupingout\u cell\u clicked,{…})
  • 然后,每次单击单元格时,我都希望在UI上生成输入字段
  • 最后,我想听听那些呈现/生成的UI上的更改
  • 我不能直接在DTOutput中编辑这些单元格,因为它不支持单元格内的向量。(因此,一对多关系)

    我已经完成了第1步和第2步。我可以使用相应的单元格渲染DTOutput。我可以观察单元格单击并在单元格单击时插入UI(
    insertUI()
    )。我创建了observeEvent对象来观察这些渲染字段。但是,这些observeEvents在编辑新生成的字段时从不触发

    ui = fluidPage(title = titlePanel("Title"), 
                   tags$head(tags$style(HTML("hr {border-top: 1px solid #000000;}"))),
                   sidebarLayout(
                    sidebarPanel(),
                    mainPanel(tabsetPanel(type = "tabs",
                                          tabPanel("Groupings", DTOutput(outputId = "groupingsOut"), 
                                                 tags$div(id = 'placeholder')),
                                          tabPanel("Test", textOutput(outputId = "statusOut")),
                                          tabPanel("Plot Generator", plotOutput(outputId = "distPlotOut")))
                    )
                   )
    
    )
    server = function(input, output) {
        # Label reactive values
        labelRVs = list()
    
        #Example table
        groupings = data.frame(names = c("cars", "mbikes", "bikes"), 
                               labels = c("Cars", "Motor Bikes", "Bikes"),
                               groups = I(list(c("toyota", "vw", "tesla"), c("harley", "kawasaki"), c("somth", "anoth", "bla"))),
                               groupLabels = I(list(c("Toyota", "VW", "Tesla"), c("Harley Davidson", "Kawasaki"), c("Something", "Another Thing", "Bla bla"))))
    
        #groupings = data.frame()
    
        proxy = dataTableProxy('groupingsOut')
    
    
        observeEvent(input$groupingsOut_cell_clicked, {
            info = input$groupingsOut_cell_clicked
            if(!is.null(info$row)){
                grouping = groupings[[info$row, 1]]
                groupingLabel = groupings[[info$row, 2]]
                groups = groupings[[info$row, 3]]
                groupLabels = groupings[[info$row, 4]]
    
                # remove previously generated UI
                removeUI(selector = paste0('#placeholder input'), multiple = TRUE)
                removeUI(selector = paste0('#placeholder label'), multiple = TRUE)
    
                # Generating ID for grouping labels
                id = paste0("groupLabel_", i)
    
                # Inserting text input for grouping label
                insertUI(selector = '#placeholder', ui = textInput(id, label = "Grouping label:", value = groupingLabel))
                labelRVs[[id]] <<- observeEvent(id, {
                    cat(paste(id, i, "\n")) # THIS LINE ONLY RUNS AT INITIALIZATION :(
                    })
    
                lapply(1:length(groups), function(i){
                    index = sprintf("%03d", i)
                    id = paste0('label_', index)
                    insertUI(selector = '#placeholder', 
                             ui = textInput(id, label = paste0("Group label for ", groups[i], ":"), value = groupLabels[i]))
                    labelRVs[[id]] <<- observeEvent(id, {
                        cat(paste(id, i, "\n")) # ALSO THIS LINE ONLY RUNS AT INITIALIZATION :(
                    })
                })
            }
        })
    
        output$groupingsOut = renderDT(groupings[, c(1, 3)], rownames = FALSE, editable = TRUE, selection = 'single')
    
    }
    shinyApp(ui = ui, server = server)
    
    ui=fluidPage(title=titlePanel(“title”),
    标签$head(标签$style(HTML(“hr{border top:1px solid#000000;}”)),
    侧边栏布局(
    侧边栏面板(),
    主面板(tabsetPanel(type=“tabs”,
    选项卡面板(“分组”,DTOutput(outputId=“groupingsOut”),
    标记$div(id='占位符'),
    选项卡面板(“测试”,文本输出(outputId=“statusOut”),
    选项卡面板(“打印生成器”,plotOutput(outputId=“distPlotOut”))
    )
    )
    )
    服务器=功能(输入、输出){
    #标记反应值
    labelRVs=list()
    #示例表
    groupings=data.frame(name=c(“汽车”、“摩托车”、“自行车”),
    标签=c(“汽车”、“摩托车”、“自行车”),
    组=I(列表(c(“丰田”、“大众”、“特斯拉”)、c(“哈雷”、“川崎”)、c(“somth”、“anoth”、“bla”)),
    groupLabels=I(列表(c(“丰田”、“大众”、“特斯拉”)、c(“哈雷戴维森”、“川崎”)、c(“某物”、“另一物”、“布拉布拉”))
    #groupings=data.frame()
    proxy=dataTableProxy('GroupingOut')
    observeEvent(输入$GroupingOut\u单元格\u单击{
    信息=输入$GroupingOut\u单元格\u单击
    如果(!为.null(info$行)){
    分组=分组[[info$行,1]]
    groupingLabel=分组[[info$行,2]]
    分组=分组[[info$行,3]]
    groupLabels=分组[[info$行,4]]
    #删除以前生成的UI
    removeUI(选择器=paste0(“#占位符输入”),多个=TRUE)
    removeUI(选择器=paste0(“#占位符标签”),多个=TRUE)
    #为分组标签生成ID
    id=paste0(“组标签”,i)
    #为分组标签插入文本输入
    insertUI(选择器='#占位符',ui=textInput(id,label=“分组标签:”,value=groupingLabel))
    
    labelRVs[[id]]我还没有理解你的代码,但是
    id
    不是一个输入,你应该做
    input[[id]]
    而不是
    observeEvent
    @StéphaneLaurent啊,你说得对!就是这样。我以前确实试过,但失败了(可能是因为其他原因)。你愿意提供一个答案让我接受吗?我还没有理解你的代码,但是
    id
    不是一个输入,你应该做
    input[[id]]
    而不是
    observeEvent
    中的
    id
    @StéphaneLaurent啊,你是对的!就是这样。我以前确实尝试过,但失败了(可能是因为其他原因)。您愿意提供一个答案让我接受吗?