我正在尝试为数据库(创建,读取,更新和删除)构建一个稍微复杂的CRUD接口(可能闪亮不是解决此问题的最佳工具,但由于我不熟悉js,因此我想尝试一下)。我已经找到了一些很好的例子,特别是Barbara的例子。现在,我正在寻找一种组合a selectizeInput和a 的快捷方式textInput(也许是selectize的选项?!),因为否则,如果我必须像下面的示例所示进行操作,那么我的代码就会变得很长。该示例将演示我想要得到的。(这不是我想要的。)
这是一个非常短的可重现示例:
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)
Run Code Online (Sandbox Code Playgroud)
对于更复杂的示例,我尝试实现一个简单的数据表进行编辑,您可以在我的github帐户上找到它。希望有一个更短的方法...
好吧,选择输入已经是textInput和的组合selectInput。这样,所需功能已经包含在selectize包中。您可以将选项参数传递给selectizeInput,该参数将直接转换为JavaScript包。请参阅此处以获取选项列表。
其中之一是创建选项,该选项指定是否和何时可以通过仅键入与任何给定选项都不匹配的内容来创建选项。
下面的示例中的整个服务器代码可以省略以说明这一点,但是我在其中留下了一些评估信息,以阐明如何真正扩展由框架创建的选择集。
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)
Run Code Online (Sandbox Code Playgroud)