shiny unable to see dataframe from reactive data o

2019-08-10 00:15发布

I'm trying to make a very simple shiny app that draws confidence intervals around sales from online advertising for exposed and control groups.

Here's my code:-

ui.R

library(shiny)

shinyUI(fluidPage(

  # Application title
  titlePanel("Easy Confidence Intervals for Proportions"),

  # Sidebar with input for the number of trials
   sidebarLayout(

 sidebarPanel(
 numericInput("exGrpSize", "Exposed Group Impressions", 10000),
 numericInput("exGrpConv", "Exposed Group Clicks or Conversions", 100),
 numericInput("contGrpSize", "Control Group Impressions", 10000),
 numericInput("contGrpConv", "Control Group Clicks or Conversions", 100)
 ),

# Show a plot of the generated distribution
mainPanel(
  plotOutput("intervalPlot")
    )
   )
))

server.R

library(shiny)
library(ggplot2)

# Define server logic required to draw a histogram
shinyServer(function(input, output) {

  # This is some very simple code to draw confidence intervals for proportions
  # wrapped in a call to renderPlot to indicate that:
  #  1) It is "reactive" and therefore should re-execute automatically when inputs change
  #  2) Its output type is a plot

  data <- reactive({
    resp1 <- input$exGrpConv
    size1 <- input$exGrpSize
    resp2 <- input$contGrpConv
    size2 <- input$contGrpSize
    rate1 <- resp1/size1
    rate2 <- resp2/size2
    se1 <- 1.96*sqrt((1/size1)*rate1*(1-rate1))
    se2 <- 1.96*sqrt((1/size2)*rate2*(1-rate2))
    dataSet <- data.frame(
                  respVec = c(rate1, rate2),
                  group = factor(c("Exposed", "Control")),
                  se = c(se1, se2))
    })

#   # Define the top and bottom of the errorbars
   limits <- aes(ymax = respVec + se, ymin = respVec - se)
#   
  output$intervalPlot <- renderPlot({  
# 
   p <- ggplot(dataSet, aes(colour=group, y = respVec, x = group))
   p + geom_point() + geom_errorbar(limits, width=0.2, lwd=2)
})
})

But when I run this I get the following error:-

Error in ggplot(dataSet, aes(colour = group, y = respVec, x = group)) : object 'dataSet' not found

How can I get the dataSet from the reactive code block in scope for the plot?

[I realise the confidence intervals in here are a bit crude, this is an initial prototype]

标签: r ggplot2 shiny
1条回答
我只想做你的唯一
2楼-- · 2019-08-10 00:53

I believe you have to return dataSet at the end of your reactive function, i.e.

data <- reactive({
    resp1 <- input$exGrpConv
    size1 <- input$exGrpSize
    resp2 <- input$contGrpConv
    size2 <- input$contGrpSize
    rate1 <- resp1/size1
    rate2 <- resp2/size2
    se1 <- 1.96*sqrt((1/size1)*rate1*(1-rate1))
    se2 <- 1.96*sqrt((1/size2)*rate2*(1-rate2))
    dataSet <- data.frame(
                  respVec = c(rate1, rate2),
                  group = factor(c("Exposed", "Control")),
                  se = c(se1, se2))
    dataSet
    })

Additionally, you should be passing data() (don't forget the parentheses) as your data.frame, not dataSet. That's the primary reason R isn't finding dataSet; it never left the scope of your reactive function, so it doesn't exist in the global environment. So you should end up using

p <- ggplot(data=data(), aes(colour=group, y = respVec, x = group))
查看更多
登录 后发表回答