寻找组合selectize和textInput的捷径

时间:2018-03-18 14:06:54

标签: r shiny

我正在尝试为数据库构建一个复杂的CRUD接口(创建,读取,更新和删除)(可能闪亮不是最好的工具,但我想尝试一下,因为我不熟悉JS)。我已经找到了一些很好的例子,特别是来自Barbara的例子。现在我正在寻找一个快捷方式来组合selectizeInputtextInput(可能作为选择的选项?!),因为否则我的代码会变得如此长,如果我必须这样做,如下所示实例显示。这个例子将展示我想要的东西。 (This不是我想要的。)

这是一个非常简短的可重复的例子:

library(shiny)
startData <- c("Berlin", "London", "Paris")

ui <- fluidPage(
  selectizeInput("town", "Town", choices = c(startData, "new town")),
  uiOutput("newTown")
)

server <- function(input, output, session) {

  rV <- reactiveValues(towns = startData)

   output$newTown <- renderUI({
     if (input$town == "new town") {
       tagList(
         textInput("text", "New Town"),
         actionButton("entry", "save town")
       )
     }
   })
   # update selectizeInput when actionButton is clicked
   observeEvent(input$entry, {
     rV$towns <- c(rV$towns, input$text)
     updateSelectizeInput(
       session, "town", "Town",
       choices = c(rV$towns, "new town"),
       selected = input$text
     )
   })
}

# Run the application
shinyApp(ui = ui, server = server)

对于更复杂的示例,我尝试实现一个简单的数据表来编辑,您可以在我的github帐户中找到该数据。希望有一个更短的方式...

1 个答案:

答案 0 :(得分:5)

嗯,选择输入已经是textInputselectInput的组合。因此,所需功能已包含在选择包中。您可以将选项参数传递给selectizeInput,它将直接转换为JavaScript包。 See here获取选项列表。

其中一个是创建选项,它指定是否以及何时只需键入与任何给定选项不匹配的内容即可创建选项。

以下示例中的整个服务器代码可以省略显示,但我在那里留下了一些评估,以阐明如何在框架创建后实际扩展选择集。

library(shiny)
startData <- c("Berlin", "London", "Paris")

ui <- fluidPage(
  selectizeInput("town", "Town", choices = startData, options=list(create=TRUE))
)

server <- function(input, output, session) {

  rV <- reactiveValues(towns = startData)

  observeEvent(input$town, {
    # nchar check, because emptying the text field results in "" choice.
    if (nchar(input$town) && !(input$town %in% rV$towns)) {
      rV$towns <- c(rV$towns, input$town)
    }

    print(rV$towns)
  })
}

shinyApp(ui = ui, server = server)