【问题标题】:Add user input column to Shiny将用户输入列添加到 Shiny
【发布时间】:2016-01-31 04:44:31
【问题描述】:

我正在尝试收集给定数据集的用户输入。我想插入一个列,用户可以在其中确定他们是否想要拥有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)

             })

           })

【问题讨论】:

  • 您只是在谈论将数据过滤为用户想要的内容吗?
  • 可能吗?但是,每个项目都必须单独选择。我不是在寻找数据表功能,而是在寻找用户对数据集的意见。
  • 也许您可以提供更多示例来说明您对 mtcars 数据集的含义。请举例说明您定义“有趣”的含义。
  • 这完全是用户主观的。我没有“有趣”,而是将其更改为用户 want to own? 汽车。
  • 如果数据是静态的,很容易将其放入谷歌表单,但左侧导航将包含将更改显示数据的控件。

标签: r shiny user-input interactive


【解决方案1】:

这个怎么样,你可以使用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"))
    })
})

【讨论】:

  • 这不是我想要的。我希望添加一个额外的列,用户可以在其中输入是/否标志。
  • DT 包具有行选择功能(如果需要,它可以与过滤器选项一起使用)。它与带有复选框的额外列的效果几乎相同。
  • @user5029763 你是对的,但 OP 似乎希望在特定条件下添加一个物理列。我个人也只会使用过滤器并单击我想要的过滤器。
  • @cdeterman 抱歉,我可能表达得很糟糕。 OP 可以使用行选择来跟踪用户对input$table_rows_selected 等的意见。
  • @user5029763 你是对的,我会提供这个作为答案,但 OP 希望添加新列。如果您想提供一个证明 input$table_rows_selected 的答案,也许 OP 可能有其他想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 2017-08-18
  • 2015-11-21
  • 2021-05-23
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多