如何禁用在R + Shiny中点击的情节

时间:2018-03-11 05:48:21

标签: r shiny shinyjs

我有一个我想要点击的图表,直到点击一个按钮。 shinyjs::disable似乎没有做到这一点。有没有办法做到这一点。

最低工作范例

library(shiny)

## ui.R
ui <- fluidPage(
    shinyjs::useShinyjs(),
    column(12,
    plotOutput("Locations", width=500, height=500,
        click="plot_click"), inline=TRUE ),
    actionButton("stop", "Stop")
)


## server.R
server <- function( input, output, session){

    x <- reactiveValues(x=runif(10))
    y <- reactiveValues(y=rnorm(10))

    ## Click To Generate New Random Points
    observeEvent(input$plot_click, {
        x$x <- runif(10)
        y$y <- rnorm(10)
    })

    ## Disable Clicking
    observeEvent(input$stop, {
        shinyjs::disable("plot_click")
    })    

    ## Render Plot
    output$Locations <- renderPlot({ 

        ## Constant
        par(bg=NA)

        plot.new()
        plot.window(
            xlim=c(0,1), ylim=c(0,1),
            yaxs="i", xaxs="i")
        axis(1)
        axis(2)
        grid(10,10, col="black")
        box()

        ## Updating
        points( x$x, y$y, cex=3, pch=16)

    })        
}

### Run Application
shinyApp(ui, server)

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。 您可以阻止server.R中的逻辑触发新绘图的渲染:

选项1。

## server.R
server <- function( input, output, session){

  x <- reactiveValues(x=runif(10))
  y <- reactiveValues(y=rnorm(10))

  disabled <- FALSE

  ## Click To Generate New Random Points
  observeEvent(input$plot_click, {
    if(disabled) return()
    x$x <- runif(10)
    y$y <- rnorm(10)
  })

  ## Disable Clicking
  observeEvent(input$stop, {
    disabled <<- TRUE
  })    

  ## Render Plot
  output$Locations <- renderPlot({ 
    # Create plot
  })        
}

选项2.(jQuery)

或者您可以使用jQuery取消绑定click事件:

## ui.R
ui <- fluidPage(
  tags$head(
    tags$script(
      HTML("
            Shiny.addCustomMessageHandler ('disablePlotClick',function (message) {
              $('#'+message.ID).unbind();
            });")
    )
  ),
  column(12,
         plotOutput("Locations", width=500, height=500,
                    click="plot_click"), inline=TRUE ),
  actionButton("stop", "Stop")
)

定义一个调用Javascript函数的函数:

disablePlotClick <- function(session, id){
  session$sendCustomMessage(type = 'disablePlotClick', message = c("ID"=id))
}

然后只需在要禁用click事件时调用该函数:

## Disable Clicking
  observeEvent(input$stop, {
    disablePlotClick(session, 'Locations')
  })  

选项2.(shinyjs)

这也可以使用shinyjs完成:

jsCode <- "shinyjs.disablePlotClick = function(ID){ $('#'+ID).unbind(); console.log(ID);}"

## ui.R
ui <- fluidPage(
  shinyjs::useShinyjs(),
  shinyjs::extendShinyjs(text = jsCode, functions=c("disablePlotClick")),

  # More UI code
)

并调用函数:

## Disable Clicking
  observeEvent(input$stop, {
    js$disablePlotClick("Locations")
  })