如何从 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<- 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)