使用在renderi中指定的值和RShiny中的selectInput

时间:2017-05-11 19:15:46

标签: r dynamic shiny

我一直在忙着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"))

            )

        )

    )

)

1 个答案:

答案 0 :(得分:0)

首先,您应该使您的代码可以重现,以便人们可以运行它并验证他们的答案。您只需要生成一些模拟数据来替换代码中的实际数据。

由于我无法测试它并且我没有时间自己创建测试数据,我猜这个问题来自你使用相同的id为ui项目和选择输入,这混淆了Shiny。动态UI项需要一个id,实际的选择输入需要另一个唯一ID。然后使用id作为选择输入。

对于动态UI,它只是html中的占位符。您可以在控制台中运行htmlOutput("select_subject")并查看您将获得的内容。出乎意料的简单吧?然后动态插入实际的选择输入。现在您有两个项目,因此您需要两个唯一ID。