Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R Shiny error: object input not found

Tags:

r

shiny

The following code is my Shiny ui:

library(shiny)
shinyUI(fluidPage(

titlePanel("All Country Spend"),

  sidebarLayout(
    sidebarPanel(  selectInput("split", 
        label = "Choose Fill For the Chart",
        choices = c("Action.Obligation","Action_Absolute_Value"),
      selected = "Action.Obligation"
        )
            ),
    mainPanel(plotOutput("SpendChart"))
)
))

And the following is the server code:

library(shiny)
library(ggplot2)

shinyServer(function(input, output) {

spend <- read.csv("data/Ctrdata.csv")
output$SpendChart <- renderPlot({

    Country <- spend$Principal.Place.of.Performance.Country.Name
    ggplot(spend, aes(x = Country, y = input$split)) + geom_bar(stat = "identity")

})

})

Every time I run it I get the following error:

"Error in eval(expr, envir, enclos) : object 'input' not found"

I am trying to render a simple bar chart that will toggle between the net and absolute value of contract spending in each country, but it won't recognize my input named "split" from the selectInput box.

Here is a sample of my data frame:

data.frame(Country = c("Turk", "Turk", "Saudi", "Saudi", "Ger", "Ger"),
Action.Obligation = c(120,-345,565,-454, 343,-565),
Action_Absolute_Value = c(120,345,565,454,343,565))
like image 211
user2907249 Avatar asked Feb 12 '15 17:02

user2907249


2 Answers

The problem is with ggplot evaluating the variable in the context of the data frame provided, spend in your case. What you want is:

ggplot(spend, aes_string(x = "Country", y = input$split))

So your working server.R code is:

library(shiny)
library(ggplot2)

shinyServer(function(input, output) {

spend <- data.frame(Country = c("Turk", "Turk", "Saudi", "Saudi", "Ger", "Ger"),
                    Action.Obligation = c(120,-345,565,-454, 343,-565),
                    Action_Absolute_Value = c(120,345,565,454,343,565))

    output$SpendChart <- renderPlot({


        ggplot(spend, aes_string(x = "Country", y = input$split)) +
            geom_bar(stat = "identity")

    })

})

Obviously, you can replace the spend df with your CSV import.

like image 168
Konrad Avatar answered Sep 28 '22 02:09

Konrad


I've solved this issue with "<<-". I don't know for sure, but it is related to global environment:

output$SpendChart <- renderPlot({

choice <<- input$split

    Country <- spend$Principal.Place.of.Performance.Country.Name
    ggplot(spend, aes(x = Country, y = choice)) + geom_bar(stat = "identity")

})
like image 40
Bruno Gomes Avatar answered Sep 28 '22 01:09

Bruno Gomes