Как отобразить несколько строк в таблице из графиков с помощью R Shiny и удалить последнюю строку из таблицы? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь построить график, используя график, где человек нажимает на geom_points, и он должен заполнить эту строку geom_point в приведенной ниже таблице.

Мне это удалось.Поэтому Person нажимает на точку geom_point на графике, чтобы отобразить данные (строку) geom_point.Теперь я пытаюсь добавить несколько строк в одну таблицу вместо того, чтобы перезаписать предыдущую строку, выбранную человеком.По сути, я хочу, чтобы человек щелкнул по нескольким точкам geom_points, и в таблице должны быть показаны все данные geom_points вместо перезаписи предыдущих.

    library(shiny)
    library(plotly)
    library(DT)

    d1=structure(list(Topic = c("compensation", "manager", "benefits",
                                "family", "communication", "worklifebalance", "perks", "compensation",
                                "benefits", "manager", "communication", "worklifebalance", "family",
                                "perks", "benefits", "compensation", "manager", "communication",
                                "family", "worklifebalance", "perks"),
                      variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
                                           .Label = c("Prct", "Count"), class = "factor"),
                      value = c(2.23121245555964, 0.723305136692411, 0.576192227534633,
                                0.202280250091946, 0.190020840995464, 0.153242613706019,
                                0.0122594090964816, 0.913705583756345, 0.609137055837563,
                                0.50761421319797, 0.50761421319797, 0.304568527918782, 0.203045685279188,
                                0, 1.49977276170277, 1.21193758521436, 0.893803969095592,
                                0.439327374640206, 0.348432055749129, 0.242387517042872,
                                0.0757460990758976),
                      group = c("APAC", "APAC", "APAC", "APAC",  "APAC", "APAC", "APAC",
                                "EMEA", "EMEA", "EMEA", "EMEA", "EMEA", "EMEA", "EMEA",
                                "AMERICAS", "AMERICAS", "AMERICAS", "AMERICAS", "AMERICAS",
                                "AMERICAS", "AMERICAS")),
                 .Names = c("Topic", "variable", "value", "group"), class = c("data.table", "data.frame"),
                 row.names = c(NA, -21L))


    ui <- fluidPage(
      fluidRow(plotlyOutput('keywords')),
      fluidRow(verbatimTextOutput("selection")),
      fluidRow(DT::dataTableOutput("table1"))
    )   

    d0 = d1
    key <- row.names(d0)

    server = function(input,output){
      output$keywords = renderPlotly({


        d0 <- data.frame(d0, key)  

        p = ggplot(d0, aes(reorder(Topic,-value), value, key = key)) +
          geom_point(aes(colour = value),
                     shape = 16,
                     size = 3,
                     show.legend = F) +
          facet_wrap(~ group)+
          theme_minimal()
        ggplotly(p)


      })
      output$selection <- renderPrint({
        s <- event_data("plotly_click")
        cat("You selected: \n\n")
        data.frame(s)
      })

      selection2 <- reactive({
        s <- event_data("plotly_click")
        cat("You selected: \n\n")
        df <- data.frame(s)
      })

      output$table1 = renderDT({
        d2 <- d1 %>% filter(key == selection2()$key)
        d2 
      }) 
    }

    shinyApp(ui, server)

, если вы запустите этот код и нажмете на точки.вы заметите, что он перезаписывает строки в таблице.Я ожидаю, что он должен продолжать добавлять строки, когда вы продолжаете нажимать на точки.Я новичок в использовании блестящих, но если есть способ использовать реактивные значения или наблюдать за событием или что-то еще?

1 Ответ

0 голосов
/ 30 января 2019

Вам необходимо обновить значение d2, чтобы вы могли сделать это с помощью reactiveVal().Вот что я изменил в вашей server функции:

  d2 <- reactiveVal(data.frame())

  observeEvent(event_data("plotly_click"), {
    d2Temp <- rbind(
      d2(),
      d1 %>% filter(key == selection2()$key)
    )
    d2(d2Temp)
  })

  output$table1 = renderDT({
    d2()
  }) 

Сначала вы должны инициализировать d2 реактивное значение пустым data.frame.Затем наблюдайте "plotly_click" и привязывайте новый ряд к старому data.frame.Последнее обновление вашего значения reactiveVal с d2(d2Temp).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...