将用户输入列添加到Shiny

时间:2015-10-30 17:11:39

标签: r shiny user-input interactive

我正在尝试收集给定数据集的用户输入。我想插入一个列,用户可以在其中确定是否要拥有mtdata集中的其中一个汽车。这是完全主观的,因为意见因人而异,所以我无法对此进行编程。有没有办法附加一个额外的列,可以是一个复选框或下拉菜单来识别用户“想要拥有的汽车?

library(shiny)

shinyApp(ui = shinyUI(fluidPage(

             titlePanel("Interesting Cars"),

             sidebarLayout(
               sidebarPanel(
                 helpText("This is a side bar")),

               mainPanel(
                 tableOutput("view")
               )
             )
           )),
         server = function(input, output) {

             output$view <- renderTable({
               head(mtcars[, 1:4], n = 6)

             })

           })

1 个答案:

答案 0 :(得分:0)

怎么样,你可以使用DT库。通过添加filter选项,用户可以定义所需的不同组件,并查看出现的汽车。

library(shiny)
library(DT)

shinyApp(ui = shinyUI(fluidPage(

    titlePanel("Interesting Cars"),

    sidebarLayout(
        sidebarPanel(
            helpText("This is a side bar")),

        mainPanel(
            DT::dataTableOutput("view")
        )
    )
)),
server = function(input, output) {

    output$view <- DT::renderDataTable({
        datatable(mtcars, 
                  filter = "top"
        )

    })

})

修改

如果真的如此重要,添加另一个列表明它是否“有趣”,如果您打算让用户在不同的条件下分配它,那么将会有更多的代码要编写。这是一个只有mpg的例子。这里的基本思想是您将数据分配给reactiveValues函数。然后可以根据需要进行修改。显然可以在更多方面进行改进(因为它将继续添加列),但它证明了这一概念。

shinyApp(ui = shinyUI(fluidPage(

    titlePanel("Interesting Cars"),

    sidebarLayout(
        sidebarPanel(
            helpText("This is a side bar"),
            uiOutput("mpg"),
            actionButton("add_label", "Mark Interesting")
            ),

        mainPanel(
            DT::dataTableOutput("view")
        )
    )
)),
server = function(input, output) {

    values <- reactiveValues(
        mydata = mtcars
        )

    output$mpg <- renderUI({
        numericInput("mpg_input", "MPG Cutoff?",
                     value = 15
                    )
    })

    output$view <- DT::renderDataTable({
        datatable(values$mydata
        )
    })

    observeEvent(input$add_label, {
        validate(
            need(!is.null(input$mpg_input), "need mpg value")
        )
        values$mydata <- data.frame(values$mydata,
                               Interesting_Flag = 
                                   ifelse(values$mydata$mpg > input$mpg_input,
                                      "Interesting",
                                      "Not Interesting"))
    })
})