Search code examples
rshinyreactive

Unused Argument Error when trying to update reactiveVal


I'm trying create a plot where I'm able to zoom in on a range and the y-axis rescales. Similar to Rescaling of y axis on an interactive plot depending on zoom except that I would like it to happen on double click.

library(shiny)
library(tidyverse)

ui <- fluidPage(
  sidebarPanel(
    actionButton('getdata', 'Get Data')  
  ),
  mainPanel(
    plotOutput('plot', brush = brushOpts(id = 'brush'), dblclick = 'dclick')  
  )
)

server <- function(input, output, session) {
  
  
  dat <- eventReactive(input$getdata, {
    tibble('BusDate' = Sys.Date() - 0:10, 'Val' = rnorm(11))
  })
  
  
  dat2 <- reactive(dat())
  observeEvent(input$dclick, {
    brush <- input$brush

    maxy <- brush$xmax
    miny <- brush$xmin

    if (is.null(miny)){
      dat2(dat())
    }else{
      dat2(dat() %>% filter(BusDate > miny & BusDate < maxy))
    }
  }, ignoreInit = TRUE)

  output$plot <- renderPlot({
    ggplot(dat2(), aes(x = BusDate, y = Val)) + geom_line()
  })
    
}

shinyApp(ui, server)

I keep getting an error that doesn't allow me to update dat2 within observe event.

Error in dat2: unused argument (dat() %>% filter(BusDate > miny & BusDate < maxy))

How do I update dat2 within observeEvent? I understand that its easier to update reactiveValues instead but I would like to know how it works specifically with reactiveVal


Solution

  • Try this:

    library(shiny)
    library(tidyverse)
    
    ui <- fluidPage(
        sidebarPanel(
            actionButton('getdata', 'Get Data')  
        ),
        mainPanel(
            plotOutput('plot', brush = brushOpts(id = 'brush'), dblclick = 'dclick')  
        )
    )
    
    server <- function(input, output, session) {
        
        
        dat <- eventReactive(input$getdata, {
            tibble('BusDate' = Sys.Date() - 0:10, 'Val' = rnorm(11))
        })
        
        
        dat2 <- reactiveVal()
        observeEvent(input$dclick, {
            brush <- input$brush
            
            maxy <- brush$xmax
            miny <- brush$xmin
            
            if (is.null(miny)){
                dat2(dat())
            }else{
                dat2(dat() %>% filter(BusDate > miny & BusDate < maxy))
            }
        }, ignoreInit = TRUE)
        
        output$plot <- renderPlot({
            df <- if(is.null(dat2())) dat() else dat2()
            ggplot(df, aes(x = BusDate, y = Val)) + geom_line()
        })
        
    }
    
    shinyApp(ui, server)
    

    You are confusing reactive with reactiveVal. You can only update the value of reactive within its definition. Update with obj(xxx) is for reactiveVal.