user2907249 user2907249 - 2 months ago 24
R Question

R Shiny error: object input not found

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

Answer

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.

Comments