2015-06-02 3 views
8

Участки в блестящих кликах поддержки и обработчики кисти. Можно ли «очистить»/«удалить»/«удалить» матовый прямоугольник, не щелкнув пользователя в другом месте на графике? Например, если бы я хотел просто сохранить чистые координаты после завершения кисти, а затем очистить график, это код, который я бы использовал, но я не знаю, как сделать бит очистки.Возможно ли «очистить» площадь щетки участка в блестящей?

library(ggplot2) 
library(shiny) 

runApp(shinyApp(
    ui = fluidPage(
    plotOutput("plot", 
       brush = brushOpts("plotBrush", delay = 5000)), 
    actionButton("clear", "Clear") 
), 
    server = function(input, output, session) { 
    values <- reactiveValues(brush = NULL) 

    output$plot <- renderPlot({ 
     ggplot(cars, aes(speed, dist)) + geom_point() 
    }) 

    brush <- reactive({ 
     input$plotBrush 
    }) 

    observeEvent(input$clear, { 
     cat(str(brush())) 
     # clear the brushed area 
    }) 
    } 
)) 

ответ

0

Сначала обратите внимание на аргументы вашего сервера. Чтобы назначить reactiveValues, вы должны сделать это внутри реактивного выражения. Таким образом, чтобы захватить кисть координаты вам нужно использовать этот

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

вместо этого

brush <- reactive({ 
     input$plotBrush 
    }) 

Второй вариант создает функцию под названием кисть, которую вы назвали бы с кистью().

Один из способов очистить график от кисти - проверить, являются ли значения $ brush нулевыми и изменить то, что вы делаете на основе этого. В этом случае, если значения $ brush не равны нулю, отображается пустой график, и новые точки не могут быть выбраны.

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 
    }) 
    } 
)) 
5

Я нахожусь в подобной ситуации, когда у меня есть несколько кистей и нужно кнопку, чтобы «очистить мир». Я не нашел официальный способ удаления щетки DIV с R кода, но оказывается, что есть этот удивительный пакет под названием 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)) 
} 
+1

Это удивительный пакет действительно :) И хорошее решение, я в конечном итоге сделать это, как хорошо, но спасибо за положить его в письменном виде здесь, так что другие могут воспользоваться в будущем –

5

С точки зрения 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 
    }) 
    } 
) 
+0

Спасибо, это помогло мне очень много и должен быть принятым в настоящее время ответом! – sedot

Смежные вопросы