如何从 Shiny 中的下拉框中根据变量选择动态创建直方图

Posted

技术标签:

【中文标题】如何从 Shiny 中的下拉框中根据变量选择动态创建直方图【英文标题】:How to dynamically create histogram upon variable selection from drop down box in Shiny 【发布时间】:2015-06-22 08:35:35 【问题描述】:

我想创建一个闪亮的应用程序,用户将在其中上传 csv 文件,上传后下拉框将填充数据集中的所有变量。

当用户从下拉框中选择一个变量时,应在主面板中绘制相应的直方图。

这是我所做的

ui.r 文件

library(shiny)

shinyUI(pageWithSidebar(
headerPanel( "Demand Forecast", "Flowserve"),
sidebarPanel(
fileInput('file1', 'Select csv file',accept=c('text/csv')
),
checkboxInput('header', 'Header', TRUE),
radioButtons('sep', 'Separator', c(Comma=',',Tab='\t',  Semicolon=';' )
),
tags$hr(),
selectInput("product", "Select: ","")
 ),
mainPanel(tableOutput('contents'),

       plotOutput("hist")
      )
       ))

server.r 文件

    library(shiny)
    library(ggplot2)


    shinyServer(function(input,output,session)



    dataUpload<-reactive(

    inFile<-input$file1
    print(inFile)
    if(is.null(inFile))
      return(NULL)
    dt_frame = read.csv(inFile$datapath, header=input$header, sep=input$sep)
    updateSelectInput(session, "product", choices = names(dt_frame))
    )


    output$hist <- renderPlot(

    dataset<- dataUpload()
    hist(dataset[,dataset$product])

    )
  ) 

但是当我运行这个应用程序时,它给了我一个错误“闭包”类型的对象不是子集

请帮忙..

提前致谢

【问题讨论】:

这是一个很好的例子,说明为什么 使用函数名作为对象名 - 一个原因是它会导致混淆错误消息。 dt 是基础 R 中的一个函数(请参阅 ?dt),当您调用 dt[, colm] 而范围内不存在数据框 dt 时,R 将尝试对函数 dt 进行子集化。因此,看看您是否可以弄清楚为什么您的数据框 dt 不在您的 hist 调用范围内。 @jbaums 感谢您的 rpl.. 我已经更改了我的 server.r 文件现在当我运行这个应用程序时,它给了我一个错误,即 X 必须是数字 传递给hist()函数的值是数字吗? @Keniajin No.. 其实我是直接从 drop box 中取出变量的。所以,它也包含其他类型的变量。 【参考方案1】:

欢迎来到 R 闪亮的世界!

您想将选定的列用于直方图 -> hist(dataset[,input$product]) 你的反应函数没有返回任何东西,但你已经写了dataset&lt;- dataUpload() -> 将return() 添加到反应函数中 您还需要在renderPlot() 中进行错误检查

最小的工作示例:

library(shiny)
library(ggplot2)

server <- function(input, output, session) 

  dataUpload<-reactive(

    inFile<-input$file1
    print(inFile)
    if(is.null(inFile))
      return(NULL)
    dt_frame = read.csv(inFile$datapath, header=input$header, sep=input$sep)
    updateSelectInput(session, "product", choices = names(dt_frame))
    return(dt_frame)
    )

    #output$contents <- renderTable(
    #   dataset<- dataUpload()
    #   dataset
    #)
    output$hist <- renderPlot(
    # we need error check also here
    if(is.null(input$file1))
      return(NULL)
    dataset<- dataUpload()
    hist(dataset[,input$product])

    )




ui <- pageWithSidebar(
headerPanel( "Demand Forecast", "Flowserve"),
sidebarPanel(
fileInput('file1', 'Select csv file',accept=c('text/csv')
),
checkboxInput('header', 'Header', TRUE),
radioButtons('sep', 'Separator', c(Comma=',',Tab='\t',  Semicolon=';' )
),
tags$hr(),
selectInput("product", "Select: ","")
 ),
mainPanel(tableOutput('contents'),

       plotOutput("hist")
      )
)


shinyApp(ui = ui, server = server)

【讨论】:

以上是关于如何从 Shiny 中的下拉框中根据变量选择动态创建直方图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Shiny 中更改回归模型表单下拉菜单中的预测变量?

从 SelectInput (R Shiny) 中的分组选项列表中获取组标签

根据下拉选择动态填充字段(Javascript / HTML)

根据下拉选择动态填充字段(Javascript / HTML)

根据用户的输入创建列联表 - R Shiny

R-Shiny:在文件输入上选择输入反应