【问题标题】:How to fix "object 'mydata' not found" in shiny app when plotting histogram绘制直方图时如何在闪亮的应用程序中修复“找不到对象'mydata'”
【发布时间】:2019-11-01 00:25:32
【问题描述】:

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

  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)

我已经实现了数据集的创建,但是显示数据直方图的代码返回错误:“object 'mydata' not found”而不是显示直方图。每当任何输入发生更改时,直方图都应该更新。

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

【问题讨论】:

    标签: r ggplot2 shiny


    【解决方案1】:

    您在 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,等等。有关详细信息,请参阅?shiny::req

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

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

    【讨论】:

    • 非常感谢您的解决方案和提示。这解决了错误,并且功能按要求工作。我现在了解可见性/环境问题,感谢您的请求指导。
    • 只是为了添加,为了使建议的修复工作我不得不在代码的第四行末尾添加一个缺少的')',它变成:data.frame(our_data=c(rep(1,input$data1s),rep(2,input$data2s)))
    猜你喜欢
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多