有可能"清除"闪亮的情节刷区?

时间:2015-06-02 06:01:42

标签: r ggplot2 shiny

闪亮支持点击和刷子处理程序中的绘图。是否可以"清除" /"删除" /"删除"没有用户点击图上其他地方的拉丝矩形?例如,如果我想在刷子完成后只存储拉丝坐标然后清除图表,这是我将使用的代码,但我不知道如何清除位。

public fullUser($id) {
    $user = User::find($id);
    $user->emails();
    return $user();
}

3 个答案:

答案 0 :(得分:6)

从Shiny version 0.14开始,可以使用session对象重置情节画笔。

下面是一个简单的Shiny应用程序,演示如何使用session$resetBrush(<BRUSH_ID>)清除拉丝区域。该应用程序允许人们突出显示点的区域或删除拉丝区域,同时保持点突出显示或删除拉丝区域并重置点的颜色。

在官方文件的https://shiny.rstudio.com/reference/shiny/latest/session.html处查看大约一半。

library(shiny)
library(ggplot2)

shinyApp(
  ui = fluidPage(
    plotOutput(
      outputId = "plot",
      brush = brushOpts(
        id = "plotBrush", 
        delay = 5000
      )
    ),
    actionButton("clearBrush", "Clear brush"),
    actionButton("resetPlot", "Reset plot")
  ),
  server = function(input, output, session) {
    output$plot <- renderPlot({
      ggplot(mtcars, aes(wt, mpg)) + 
        geom_point() +
        geom_point(
          data = brushedPoints(mtcars, brush),
          color = "#79D8CB",
          size = 2
        )
    })

    brush <- NULL
    makeReactiveBinding("brush")

    observeEvent(input$plotBrush, {
      brush <<- input$plotBrush
    })

    observeEvent(input$clearBrush, {
      session$resetBrush("plotBrush")
    })

    observeEvent(input$resetPlot, {
      session$resetBrush("plotBrush")
      brush <<- NULL
    })
  }
)

答案 1 :(得分:5)

我发现自己处于类似的情况,我有多个画笔,需要一个按钮来“清除世界”。我还没有找到一个用R代码删除画笔div的官方方法,但事实证明这是一个很棒的包叫做shinyjs;)

library(shiny)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  actionButton("clear", "Clear brush"),
  fluidRow(
    column(
      width = 6,
      plotOutput("p1", brush = brushOpts("b1"))
    ),
    column(
      width = 6,
      plotOutput("p2", brush = brushOpts("b2"))
    )
  ),
  fluidRow(
    column(
      width = 6,
      verbatimTextOutput("brush1")
    ),
    column(
      width = 6,
      verbatimTextOutput("brush2")
    )
  )
)

server <- function(input, output) {

  values <- reactiveValues(
    brush1 = NULL,
    brush2 = NULL
  )

  # update reactive values when input values change
  observe({
    values$brush1 <- input$b1
    values$brush2 <- input$b2
  })

  # display brush details
  output$brush1 <- renderPrint({
    values$brush1
  })

  output$brush2 <- renderPrint({
    values$brush2
  })

  # clear brush values and remove the div from the page
  observeEvent(input$clear, {
    values$brush1 <- NULL
    values$brush2 <- NULL
    runjs("document.getElementById('p1_brush').remove()")
    runjs("document.getElementById('p2_brush').remove()")
  })

  output$p1 <- renderPlot({
    input$clear
    m <- brushedPoints(mtcars, values$brush1, allRows = TRUE)
    qplot(data = m, wt, mpg, colour = selected_) + 
      theme(legend.position = "none")
  })

  output$p2 <- renderPlot({
    input$clear
    m <- brushedPoints(mtcars, values$brush2, allRows = TRUE)
    qplot(data = m, wt, mpg, colour = selected_) +
      theme(legend.position = "none")
  })

}

shinyApp(ui, server)

IMO,闪亮应该提供类似的东西:

clearBrush <- function(id) {
  shinyjs::runjs(sprintf("document.getElementById('%s_brush').remove()", id))
}

答案 2 :(得分:0)

首先说明服务器参数。要分配reactiveValues,您必须在反应式表达式中执行此操作。因此,要捕获画笔坐标,您需要使用此

  observeEvent(input$plotBrush,{
    if(is.null(values$brush)){
    values$brush <- input$plotBrush}
  })

而不是

brush <- reactive({
      input$plotBrush
    })

第二个版本创建了一个名为brush的函数,您可以使用brush()调用它。

在刷子上清除绘图的一种方法是测试值$ brush是否为null,并根据它改变你的行为。在这种情况下,如果值$ brush不为null,则显示空白图并且无法选择新点。

library(ggplot2)
library(shiny)

runApp(list(
  ui = fluidPage(
    plotOutput("plot",
               brush = brushOpts("plotBrush", 
                                 delay = 5000,
                                 resetOnNew = TRUE)
               # resetOnNew = TRUE clears the brush
               # each time a new plot is displayed.
               ),
    p("Brushed Points:"),
    verbatimTextOutput("brushedPoints")
  ),
  server = function(input, output, session) {
    values <- reactiveValues(brush = NULL)

    output$plot <- renderPlot({
      if(is.null(values$brush)){
        ggplot(cars, aes(speed, dist)) + geom_point()
      } else {
        ggplot(cars, aes(speed, dist)) + geom_blank()
      }
    })

    observeEvent(input$plotBrush,{
      #Run this whenever points are brushed
      if(is.null(values$brush)){
        values$brush <- input$plotBrush}
    })

    output$brushedPoints <- renderPrint({
      values$brush
    })
  }
))

还可以使用第二个选项,有关说明,请参阅https://stackoverflow.com/a/35066532/3229332

library(ggplot2)
library(shiny)

runApp(list(
  ui = fluidPage(
    plotOutput("plot",
               brush = brushOpts("plotBrush", 
                                 delay = 5000,
                                 resetOnNew = TRUE)
               # resetOnNew = TRUE clears the brush
               # each time a new plot is displayed.
    ),
    p("Brushed Points:"),
    verbatimTextOutput("brushedPoints")
  ),
  server = function(input, output, session) {
    values <- reactiveValues(brush = NULL)

    output$plot <- renderPlot({
      if(is.null(values$brush)){
        ggplot(cars, aes(speed, dist)) + geom_point()
      } else {
        ggplot(cars, aes(speed, dist)) + geom_blank()
      }
    })

    observeEvent(input$plotBrush,{
      #Run this whenever points are brushed
        output$plot <- renderPlot({
          if(is.null(values$brush)){
            ggplot(cars, aes(speed, dist)) + geom_point()
            values$brush <- input$plotBrush
          } else {
            ggplot(cars, aes(speed, dist)) + geom_blank()
          }
        })
        }
    )

    output$brushedPoints <- renderPrint({
      values$brush
    })
  }
))