首页 > 解决方案 > 绘制直方图时如何在闪亮的应用程序中修复“找不到对象'mydata'”

问题描述

我正在尝试创建一个闪亮的应用程序,让用户

  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'”而不是显示直方图。每当任何输入发生更改时,直方图都应该更新。

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

标签: rggplot2shiny

解决方案


您在响应式中定义的 mydata 在mydatatable其他任何地方都不可见。要了解原因,我建议您阅读 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只是寻找“真实”的东西,意思是: not NULL, not NA, not FALSE,长度大于 0 等。有关?shiny::req详细信息,请参阅。

虽然req不是严格要求,但它有其优点。正如您可以从表代码中推断的那样,req(x)将返回“传入的第一个值”(from ?req),因此为了简洁起见,它可以在此快捷方式中使用。

最后一个肥皂盒:在我有限的shiny反应性经验中,我很少在反应性块中生成数据并仅在该反应性块中使用它。鉴于此,每当您创建一个data.frame(或list或...一些依赖于用户输入的重要结构)时,将其设为自己的反应组件(特别是,不是output组件)通常是有益的,然后尽可能多地依赖它必要时。


推荐阅读