Удаление данных с помощью зачеркнутых точек в блестящей / Понимание реактивных переменных - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу иметь возможность удалять точки данных, выбирая их на графике.

Этот примерный код выполняет следующие действия: В пользовательском интерфейсе я создаю 2 selectInputs, который управляет тем, какие данные используются для осей x и y. Затем я создаю график и включаю выбор точек на графике. Под графиком показаны выбранные в данный момент точки. Также есть кнопка «Удалить данные», но она еще ни к чему не подключена.

На сервере я создаю фрейм данных "de" и присваиваю моим осям x и y (XVar, YVar) значения пользовательского интерфейса. Затем я пытаюсь создать реактивное значение для основного фрейма данных

dePlot<-reactive({de})

Моя цель с этими переменными: Иногда я хочу навсегда изменить базовые данные (например, удалить данные), а затем написать «де». Иногда я хочу переменную, которая сбрасывается каждый раз, чтобы "де" в каждом, например. наблюдатель или выходное событие. У меня такое чувство, что я не достигаю этой цели таким образом ...

Тогда я создаю сюжет.

Затем следует вывод $ brush_info и наблюдение за событием. «Output $ brush_info» возвращает текущее значение dePlot и фильтры для используемых в настоящее время осей x и y. Таким образом, я не удаляю данные, которые в данный момент не отображаются на графике. И затем выбранные точки отправляются в пользовательский интерфейс.

Событие наблюдения получает выбранные значения и фильтрует каждую выбранную строку из фрейма данных, а затем сохраняет его в главном фрейме данных «de».

print(de) 

показывает мне, что фильтрация работает так, как задумано. Но это на самом деле не обновляет «de» и, следовательно, не «dePlot», поэтому мой график остается неизменным. Я предполагаю, что это потому, что я "пойман" в событии наблюдения и не могу передать переменные оттуда. У меня такое чувство, что я действительно близок, но просто не понимаю реактивных значений, достаточных для того, чтобы закончить.

Надеюсь, я сделал эту проблему не слишком запутанной, и каждая помощь приветствуется.

Мой интерфейс

library("shiny")
library("shinyFiles")
library("shinydashboard")
library("shinyBS")
library("plotly")
library("jpeg")
library("imager")

shinyUI(

    dashboardPage(
      dashboardHeader(disable = T),
      dashboardSidebar(width = 200,

                       sidebarMenu(width=3,
                                   menuItem(startExpanded = T,

                                     selectInput("XVar","Please Select X-Axis",
                                                 choices=c("eins","zwei","drei"),selected="eins"),
                                     selectInput("YVar","Please Select Y-Axis",
                                                 choices=c("eins","zwei","drei"),selected="zwei")
                                           )
                                   )
                       ),
      dashboardBody(width=9,


              tabItem(tabName = 'box2',
                      tabBox(width = 16,
                             tabPanel("Long time data",plotOutput("myPlot", click = "plot1_click",brush = brushOpts(id = "plot1_brush"))
                                     ,actionButton('DeleteData?','DeleteSelectedData'),column(width = 6,h4("Brushed points"),verbatimTextOutput("brush_info"))
                                     )
                             )
                      )        
              )
      )
)

Мой сервер

shinyServer(function(input, output,session){

eins<-c(1,2,3,4,5,6,7,8,9,10)
zwei<-c(4,6,3,4,400,-500,900,8,12,5)
drei<-c(989,663,74,543,222,1541,1515,12,525,21)
isolate({de<-data.frame(eins,zwei,drei)})

XVar<-reactive({input$XVar})
YVar<-reactive({input$YVar})

dePlot<-reactive({de})

output$myPlot <-renderPlot({

  ggplot(data=dePlot())+
    geom_line(aes_string(x=XVar(),y=YVar()
                         )
              )
  })

output$brush_info <- renderPrint({

  deBrush<-dePlot()[,c(XVar(),YVar())]
  brushedPoints(deBrush, input$plot1_brush)
  })

observe({

  Var1<-brushedPoints(dePlot(), input$plot1_brush,allRows = TRUE)

  Var12<-as.numeric((row.names(Var1[Var1$selected_==TRUE,])))

  de<-dePlot()[-Var12,]

  print(de)
  })
})

1 Ответ

0 голосов
/ 08 апреля 2019
library(shiny)
library(shinydashboard)
library(ggplot2)

Почти только изменения стиля в ui:

ui <- dashboardPage(
  dashboardHeader(disable = TRUE),
  dashboardSidebar(
    width = 200,
    sidebarMenu(
      width = 3, 
      menuItem(
        startExpanded = TRUE,
        selectInput("XVar", "Please Select X-Axis", 
                    choices = c("eins", "zwei", "drei"), selected = "eins"), 
        selectInput("YVar","Please Select Y-Axis",
                    choices = c("eins", "zwei", "drei"), selected = "zwei")
      )
    )
  ),
  dashboardBody(
    width=9,
    tabItem(
      tabName = 'box2',
      tabBox(
        width = 16,
        tabPanel(
          "Long time data", 
          plotOutput("myPlot", click = "plot1_click", 
                     brush = brushOpts(id = "plot1_brush")), 
          actionButton('DeleteSelectedData', 'DeleteData ? '), 
          actionButton('ResetData', 'Reset data'), 
          column(
            width = 6,
            h4("Brushed points"), 
            verbatimTextOutput("brush_info"))
        )
      )
    )        
  )
)
  • input$... s не нужно заключать в reactive({ })
  • нам нужнокакое-то «состояние» (хотя обычно этого лучше избегать в Shiny), и для этого можно использовать reactiveVal(), для этого
  • эффект actionButton s легче контролировать с помощью observeEvent(), чем observe()
server <- function(input, output, session) {
  eins <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  zwei <- c(4, 6, 3, 4, 400, -500, 900, 8, 12, 5)
  drei <- c(989, 663, 74, 543, 222, 1541, 1515, 12, 525, 21)
  de <- data.frame(eins, zwei, drei)

  rx_de <- reactiveVal(de)

  output$myPlot <- renderPlot({
    ggplot(data = rx_de()) +
      geom_line(aes_string(x = input$XVar, y = input$YVar))
  })

  output$brush_info <- renderPrint({
    brushedPoints(rx_de(), input$plot1_brush)[, c(input$XVar, input$YVar)]
  })

  observeEvent(input$DeleteSelectedData, {
    Var1 <- brushedPoints(rx_de(), input$plot1_brush, allRows = TRUE)
    rx_de(Var1[!Var1$selected_, names(Var1) != "selected_", drop = FALSE])
  })

  observeEvent(input$ResetData, {
    rx_de(de)
  })
}

shinyApp(ui, server)
...