我一直在忙着Boston 311 Request Dataset,特别是为了学习RShiny。最终目标是显示关闭邻居的311个请求以及城市部门类型所需时间的时间序列图。
这个想法非常简单,用户看到两个selectInput
命令,一个下拉列表定义波士顿的邻域,然后是第二个下拉列表,指定该邻域内请求的相关部门。
并非所有社区都有相同类型的请求,因此我使用renderUI
动态呈现第二个selectInput
。
我现在在服务器功能中使用renderUI
将数据返回给我的问题。
这是我的服务器功能代码(整个功能的编辑片段)
server <- function(input, output) {
data <- city_data
neighborhood_dat <- reactive({
data <- selectNeighborhood(data, input$neighborhood)
})
# Uses neighborhood dat to generate the relevant list of subjects / city departments dynamically
subject_data <- reactive({
data <- neighborhood_dat()
data <- list(unique(data$SUBJECT))
data <- data[[1]]
})
# Renders the select input function dynamically, choices are based on the variable subject_data()
output$select_subject <- renderUI({
data <- subject_data()
selectInput("select_subject",
"Department: ",
choices = data)
})
# Uses ggplot to plot the data.
# The selectDept() function takes a dataframe, and selects out the relevant department.
# The idea is that the input$select_subject argument *should* be taken from the rendered selectInput.
ts_data <- reactive({
data <- selectDept(data, input$select_subject)
data$open_dt <- as.POSIXlt(data$open_dt)
mean <- neighborhood_plot(data, input$neighborhood, mean)
se <- neighborhood_plot(data, input$neighborhood, function(x) sqrt(var(x)/length(x)))
means <- fortify.zoo(means)
se <- fortify.zoo(sd)
means$se <- se$se
means <- means[1:(nrow(means)-1),]
})
output$ts_plot <- renderPlot({
plot_dat <- ts_data()
plot <- # Plot Args go here #
plot
})
}
具体来说,我想集中讨论以下几行代码:
output$select_subject <- renderUI({
data <- subject_data()
selectInput("select_subject",
"Department: ",
choices = data)
})
ts_data <- reactive({
data <- selectDept(data, input$select_subject)
output$select_subject
是我渲染动态UI的地方。 ts_data
将用于使用ggplot绘制time_series数据。 data <- selectDept(data, input$select_subject)
指定一个带有两个参数的函数:数据框和部门/主题名称(由input$select_subject
指定)。 input$select_subject
位不起作用,我对如何从renderUI
对象获取部门/主题名称感到有些困惑。
这是我完整性的ui代码:
ui <- fluidPage(
titlePanel("Boston 311 Request Times"),
sidebarLayout(
sidebarPanel(
selectInput("neighborhood",
"Neighborhood: ",
choices = neighborhood_list),
htmlOutput("select_subject")
),
tabPanel("Plot",
fluidRow(
column(12, plotOutput("ts_plot"))
)
)
)
)
答案 0 :(得分:0)
首先,您应该使您的代码可以重现,以便人们可以运行它并验证他们的答案。您只需要生成一些模拟数据来替换代码中的实际数据。
由于我无法测试它并且我没有时间自己创建测试数据,我猜这个问题来自你使用相同的id为ui项目和选择输入,这混淆了Shiny。动态UI项需要一个id,实际的选择输入需要另一个唯一ID。然后使用id作为选择输入。
对于动态UI,它只是html中的占位符。您可以在控制台中运行htmlOutput("select_subject")
并查看您将获得的内容。出乎意料的简单吧?然后动态插入实际的选择输入。现在您有两个项目,因此您需要两个唯一ID。