Удаление данных с закрашенными точками в блестящих / Понимание реактивных переменных

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

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

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

dePlot<-reactive({de})

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

Затем я создаю сюжет.

Затем следует событие output$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)
  })
})
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
278
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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$... не нужно заворачивать reactive({ })
  • нам нужно какое-то «состояние» (хотя обычно этого лучше избегать в Shiny), и мы можем использовать reactiveVal() для этого
  • эффект actionButtons легче контролировать с помощью 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)

Другие вопросы по теме