绘制直方图时如何修复闪亮的应用程序中的“找不到对象'mydata'”

时间:2019-11-01 00:25:32

标签: r ggplot2 shiny

我正在尝试创建一个可以让用户使用的闪亮应用

  1. 通过输入不同值的频率计数来创建数据集

  2. 绘制该数据集的直方图

一对配对的代码示例如下:

library(shiny)
library(ggplot2)

# Define UI for application
ui <- fluidPage(


    # Sidebar with inputs
    sidebarLayout(
        sidebarPanel(
            numericInput("data1s",
                         "How many have a score of 1?",
                         value = 0,
                         min = 0
            ),
            numericInput("data2s",
                         "How many have a score of 2?",
                         value = 0,
                         min = 0
            ),
            sliderInput("bins",
                        "Number of bins:",
                        min = 1,
                        max = 3,
                        value = 1)
        ),

        # Show a plot of the data
        mainPanel(
            htmlOutput("mydatatable"),
            plotOutput("distPlot")
        )
    )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
    #show the data
    output$mydatatable <- renderTable({
        #create the dataframe from the frequncies
        mydata <- data.frame(our_data=c(rep(1,input$data1s),rep(2,input$data2s))
        )
    }
    )
    #show the histogram
    output$distPlot <- renderPlot({
        ggplot(mydata, aes(x=our_data)) +
            geom_histogram(bins = input$bins)

    })
}

# Run the application 
shinyApp(ui = ui, server = server)

我已经完成了数据集的创建,但是用于显示数据直方图的代码返回了一个错误:“未找到对象'mydata'”而不是显示了直方图。只要更改任何输入,直方图就会更新。

任何解决问题的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您在mydatatable反应式中定义的mydata在其他任何地方都不可见。为了理解原因,我建议您阅读有关R的名称空间和环境的信息。 Hadley的Advanced R -- Environments是其中一个很好的教程。

要解决此问题,建议您将数据本身作为反应块,并依赖于其他两个块(表和图)中的数据:

server <- function(input, output) {
    mydata <- reactive({
      req(input$data1s, input$data2s)
      data.frame(our_data=c(rep(1,input$data1s),rep(2,input$data2s)))
    })

    #show the data
    output$mydatatable <- renderTable({ req(mydata()); })

    #show the histogram
    output$distPlot <- renderPlot({
      req(mydata())
      ggplot(mydata(), aes(x=our_data)) +
          geom_histogram(bins = input$bins)
    })
}

(未经测试。)

我添加了req的使用,仅是为了防止应用程序中的启动抖动和警告/错误。当闪亮的应用程序开始预热时,通常会清空输入变量(NULL),并且依赖于它的事物会暂时产生错误,直到输入稳定为止。 (例如,为什么事情会失败,input$data1s可能最初显示NULL值,然后尝试查看data.frame(our_data=rep(1,NULL))是否可以工作。)

req只是查找“真实的”东西,这意味着:不是NULL,不是NA,不是FALSE,长度大于0,依此类推。请参见{ {1}}以获得更多详细信息。

虽然?shiny::req并非严格要求,但它有其优点。从表代码可以推断出,req将返回“传入的第一个值” (来自req(x)),因此可以在此快捷方式下使用为简洁起见。

最后一个肥皂盒:以我对?req反应性的有限经验,很少有几次在反应式块中生成数据并仅在该反应式块中使用数据。鉴于此,每当您创建shiny(或data.frame或...依赖于用户输入的某些重要结构)时,使其成为自己的反应性组件通常是有益的(特别是, list组件),然后根据需要多次依赖它。