Если оператор не работает 2 раза подряд в блестящем приложении - PullRequest
1 голос
/ 26 мая 2020

У меня есть блестящее приложение, которое отображает 3 вкладки.

На вкладке Documents есть таблица. Когда пользователь нажимает на setosa 1-й строки, он переходит на вкладку View (видимую только при нажатии) и видит таблицу. Когда пользователь щелкает setosa 2-й строки, он переходит на вкладку View и видит другую таблицу. Также эти таблицы должны быть видны только на вкладке View.

Кажется, что приложение работает нормально, но если я нажму на 1-ю строку setosa, перейду на вкладку View, вернусь к Documents снова вкладка и попробуйте еще раз щелкнуть 1-ю строку setosa ничего не происходит. Мне нужно щелкнуть 2-ю строку setosa, чтобы она снова заработала. То же самое происходит со второй строкой setosa.

Короче говоря, я не могу выполнить одно и то же действие дважды подряд, и я чувствую, что мое условие if отвечает за это.

library(shiny)
library(shinydashboard)
library(shinyWidgets)
library(shinydashboardPlus)
library(DT)
library(shinyjs)

shinyApp(
  ui = dashboardPagePlus(
    header = dashboardHeaderPlus(title = span(strong("ArmorDoc"),style = "color: black;")

    ),
    sidebar = dashboardSidebar(

    ),
    body = dashboardBody(

      useShinyjs(),
      tags$hr(),
      tabsetPanel(
        id ="tabA",
        type = "tabs",
        tabPanel("Documents",icon = icon("accusoft"),
                 tags$hr(),
                 DTOutput("dt1")),
        tabPanel("View", icon = icon("table"),
                 DTOutput("dt3")
        ),
        tabPanel("Upload", icon = icon("table")

        )

      )

    )),
  server = function(input, output,session) {
    observeEvent(input$tabA, {
      if(input$tabA == "Documents"|input$tabA=="Upload"){
        hideTab("tabA", "View")
      }
    })



    observeEvent(input$dt1_cell_clicked, {
      # alternative: input$dt1_cells_selected
      if (req(input$dt1_cell_clicked$value) == "setosa") {
        showTab("tabA", "View")
        updateTabsetPanel(session, inputId = "tabA", selected = "View")
      }
    })

    output$dt1 <- DT::renderDataTable({
      DT::datatable(
        iris[1:2,],
        filter = "top",
        options = list(searchHighlight = TRUE, search = list(search = ""),pageLength = 5,columnDefs = list(list(className = 'dt-left', targets = "_all"))),rownames= FALSE,
        selection = list(mode = 'single', target = 'cell')
      ) 

    })


    output$dt3 <- renderDT(server = F,
                           if(input$dt1_cell_clicked$row == 1&input$tabA=="View"){

                             datatable(iris)
                           }
                           else if(input$dt1_cell_clicked$row == 2&input$tabA=="View"){
                             datatable(mtcars)
                           }
                           else{
                             return(NULL)
                           }
    )


  }
)

1 Ответ

0 голосов
/ 26 мая 2020

Ответ можно найти здесь . Это тот же метод Proxy в observeEvent().

...