Как я могу наблюдать динамически сгенерированный пользовательский интерфейс из клика ячейки таблицы данных? - PullRequest
1 голос
/ 03 мая 2019

Чтобы редактировать структуру данных типа «один ко многим»,

  1. Я хотел бы создать таблицу данных (DTOutput), в которой я наблюдаю щелчки ячеек observeEvent(input$groupingsOut_cell_clicked, {...}).
  2. Затем при каждом щелчке ячейки я хотел бы генерировать поля ввода в пользовательском интерфейсе.
  3. Наконец, я хотел бы прослушать изменения в этом визуализированном / сгенерированном пользовательском интерфейсе.

Я не могу редактировать эти ячейки непосредственно в DTOutput, так как он не поддерживает векторы внутри ячеек.(Следовательно, отношение один-ко-многим).

Я справился с шагами 1 и 2. Я могу отобразить DTOutput с соответствующими ячейками.Я могу наблюдать клики по ячейкам и вставлять пользовательский интерфейс (insertUI()) при щелчках по ячейкам.Я создал объекты наблюдения для наблюдения за этими визуализированными полями.Однако эти наблюдаемые события никогда не запускаются при редактировании вновь созданных полей.

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)

Однако этот пример Блестящий - могут ли динамически генерируемые кнопки выступать в качестве триггера для события работает отлично.В примере вместо insertUI в теги используется renderUI для outputUI .Я адаптировал мой код выше для использования renderUI, который также не удался.На данный момент, я подозреваю, что DTOutput не ведет себя так же, как другие поля ввода.

Остерегайтесь использования оператора << - для назначения labelRVs для поддержания живых объектов наблюдения.Это действительно необходимо, что показано в примере. </p>

Интересно, есть ли способ наблюдать такие поля?

...