renderPlot生成错误“类型'闭包的对象'不是子集”

时间:2016-03-04 01:22:55

标签: r shiny

我目前正在尝试在由4个sliderInputs设置的值的数据帧上使用renderplot(),并且我一直遇到同样的错误。

library(shiny)

# Define server logic for random distribution application

shinyServer(function(input, output) {

sliderValues <- reactive ({
#compose data frame
  ws<- as.numeric  (c(0:input$sws))
  df<-data.frame(
      WindSpeed = as.numeric  (c(ws)
      ),
      CBH = as.numeric (c(input$sCBH)
                          ),
      FFMC = as.numeric (c(input$sFFMC)
                          ),
      DC = as.numeric  (c(input$sDC)
                         ),
      PCFI = as.numeric  (c((exp(-66.62+(-0.993*input$sCBH)+(0.568*ws)+(0.671*input$sFFMC)+(0.018*input$sDC)))/(1+(exp(-66.62+(-0.993*input$sCBH)+(0.568*ws)+(0.671*input$sFFMC)+(0.018*input$sDC)))))
                        )

      )



})

#Show the values using an HTML table
output$summary <- renderPlot ({
  plot(df$WindSpeed, df$PCFI)
})  
output$values <- renderTable({
    sliderValues()

  })

})

我不确定为什么R会为此踢出错误,但我是Shiny包的新手,我认为它与我创建变量时定义变量有关?我的最终目标似乎不应该是难的......但我一直坚持让代码生成图表很长一段时间。

library(shiny)

shinyUI
  (fluidPage(
    titlePanel("Wildfire Behaviour Model"),

    #Sidebar with sliders that demonstrate various available 
    #options
    sidebarLayout(
        sidebarPanel(
          #Simple integer interval
          sliderInput ("sws", "10m Wind Speed (km/hr):",
                   min=0,
                   max=50,
                   value=15),
          sliderInput ("sCBH", "Crown Base Height (m):",
                   min=0,
                   max=25,
                   value=5),
          sliderInput ("sFFMC", "Fine Fuel Moisutre Code:",
                   min = 77,
                   max=98,
                   value = 88,
                   step=1.0),
          sliderInput("sDC", "Drought Code:",
                  min=0,
                  max= 1000,
                  value = 200)
          ),

        #Show a table summarizing the values entered
        mainPanel(
            plotOutput("summary"),
            tableOutput("values")
            )
        )
    ))

感谢您对该主题的任何帮助,并感谢您抽出宝贵时间来阅读我的问题。凯文

1 个答案:

答案 0 :(得分:3)

您的数据框(df)在reactive表达式

之外不存在
sliderValues <- reactive ({
#compose data frame
  ws<- as.numeric  (c(0:input$sws))
  df<-data.frame(
      WindSpeed = as.numeric  (c(ws)
      ),
      CBH = as.numeric (c(input$sCBH)
                          ),
      FFMC = as.numeric (c(input$sFFMC)
                          ),
      DC = as.numeric  (c(input$sDC)
                         ),
      PCFI = as.numeric  (c((exp(-66.62+(-0.993*input$sCBH)+(0.568*ws)+(0.671*input$sFFMC)+(0.018*input$sDC)))/(1+(exp(-66.62+(-0.993*input$sCBH)+(0.568*ws)+(0.671*input$sFFMC)+(0.018*input$sDC)))))
                        )

      )

这段代码实际上是将sliderValues设置为您的数据框。但它是反应性的,所以当你改变输入时它会更新。

在被动表达式中,有一个'理解'return语句,它将最后一个条目返回到sliderValues()

您需要的更改是如何访问绘图功能中的data.frame

#Show the values using an HTML table
output$summary <- renderPlot ({
  plot(sliderValues()$WindSpeed, sliderValues()$PCFI)
})  

由于sliderValues()基本上 是您的数据框。

我更喜欢构建反应式数据框的方式更像是

df_sliderValues() <- reactive({

    ## code to generate my data frame
    df <- data.frame(a = c(...),
                     b = c(...))
    return(df)
})

output$plot <- renderPlot({
    plot(df_sliderValues()$a, df_sliderValues()$b).
})