删除闪亮/不清晰的反应变量中带有刷点的数据

时间:2019-04-08 11:05:41

标签: r shiny reactive

我希望能够通过在图中选择数据点来删除它们。

此示例代码执行以下操作: 在Ui中,我创建2个selectInputs,用于控制x和y轴使用哪些数据。然后,我创建一个图并启用在图中选择点的功能。在该图下显示了当前选定的点。还有一个“ DeleteData”按钮,但该按钮尚未连接任何东西。

在服务器中,我创建一个数据框“ de”,并为x和y(XVar,YVar)轴分配ui的值。然后我尝试为主数据框创建一个反应性值

dePlot<-reactive({de})

此变量的目标是: 有时我想永久更改基础数据(例如,删除数据),然后我想写“ de”。有时我想要一个变量,每次都会将其重置为“ de”。观察者或输出事件。 我觉得我并没有以这种方式真正实现这个目标。

然后我创建情节。

然后是输出$ brush_info并观察事件。 “ output $ brush_info”获取dePlot的当前值,并且过滤器用于当前使用的x和y轴。这样,我不会删除图中未显示的数据。然后将选定的点发送到ui。

observe事件获取选定的值,并从数据框中过滤出每个选定的行,然后将其保存到主数据框“ 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 :(得分:0)

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()
  • actionButtonobserveEvent()更容易控制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)