Grzegorz Ky
Grzegorz Ky

Reputation: 41

R shiny invalid formula

I have a problem. I want to use sidebar to curb time series plot, however, I get invalid formula error when trying to do the plot. Can someone pls help?

server.r

library(shiny)
library(BCA)

data(Eggs)
# Define server logic required to plot 
shinyServer(function(input, output) {

  formulaX <- reactive({
    tmp <- paste(input$range,collapse = ":")
    paste("Eggs[",tmp,",1]")
  })
  formulaY <- reactive({
    tmp1 <- paste(input$range,collapse = ":")
    paste("Eggs[",tmp1,",5]")
  })

  # Return the formula text for printing as a caption
  output$caption <- renderText({
    paste(formulaX(),formulaY(),sep = " ")
  })

  #creating plot -ERROR
  output$mpgPlot <- renderPlot({
    plot(as.formula(formulaX()),as.formula(formulaY()))
  })
})

ui.r

library(shiny)

# Define UI 
shinyUI(pageWithSidebar(

  # Application title
  headerPanel("Eggs"),

  sidebarPanel(
    # Specification of range within an interval
    sliderInput("range", "Range:",
                min = 1, max = 105, value = c(20,50))
  ),

  mainPanel(
    h3(textOutput("caption")),
    plotOutput("mpgPlot")
  )
))

Upvotes: 1

Views: 203

Answers (1)

r2evans
r2evans

Reputation: 160952

"Eggs[1:10,1]" is not a formula, it is a character-representation of a subset. Since you are always choosing columns 1 and 5, your "formula" is always "Cases ~ Week" (I don't have BCA installed, I think that's correct), and you are intending to use a subset of rows from the data.

Perhaps this would work instead (hasty, some programming safeguards would be appropriate):

# no need for formulaX(), formulaY()
# not certain what you want/need from output$caption
dataX <- reactive({ Eggs[input$range[1]:input$range[2],,drop = FALSE] })

and your plot:

output$mpgPlot <- renderPlot({
  plot(Cases ~ Week, data = dataX())
})

or

output$mpgPlot <- renderPlot({
  x <- dataX()
  plot(x$Week, x$Cases)
})

Upvotes: 1

Related Questions