R DT::datatable中的SelectizeInput只能作为html使用

R DT::datatable中的SelectizeInput只能作为html使用,r,shiny,dt,R,Shiny,Dt,我正在尝试在时间跟踪应用程序中为最终用户优化用户体验。本质上,它从google calendar的api中提取数据,将其安排在一个TIBLE中,让用户选择/取消选择/编辑会议,并将其分配给项目。这些项目是在我使用selectizeInput构建的下拉菜单中选择的,但是我得到了类似于selectInput的东西 我想在Shinny中的DT::datatable中使用Shinny::selectizeInput。我可以让他们去工作。但是,我正在丢失selectize输入附带的搜索功能。在我的玩具示例

我正在尝试在时间跟踪应用程序中为最终用户优化用户体验。本质上,它从google calendar的api中提取数据,将其安排在一个TIBLE中,让用户选择/取消选择/编辑会议,并将其分配给项目。这些项目是在我使用selectizeInput构建的下拉菜单中选择的,但是我得到了类似于selectInput的东西

我想在Shinny中的DT::datatable中使用Shinny::selectizeInput。我可以让他们去工作。但是,我正在丢失selectize输入附带的搜索功能。在我的玩具示例中,顶部的selectizeInput可以单击并键入要查找的选项。在datatable中,您仍然可以这样做,但是对于复杂的名称,如果您可以看到您键入的内容,那么UX会更好

我在github存储库中发现了这个问题,DT包的制造商说这样的事情可能是不可能的。然而,它已经3岁了,也许有人想出了一个解决办法。

我还尝试使用另一种ui类型TuiCalendar,就我而言,它工作得很好,但遇到了同样的问题。我在JS方面的经验是有限的,所以我很难在Shiny中定制JS

library(shiny)
library(DT)

ui <- fluidPage(
  selectizeInput("input", 
                 label = "",
                 choices = letters[1:26],
                 selected = letters[1]),
DTOutput("datatable")
)


server <- function(input, output) {

output$datatable<- renderDataTable({
  DT::datatable(data.frame(a = as.character(selectizeInput("dtinput",
                                label = "",
                                choices = letters[1:26],
                                selected = letters[1]),
             stringsAsFactors = F)),
             escape = F)
})


}

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

我对其他方法持开放态度,理想的做法是在日历视图中显示数据,并在标题下方显示复选框和下拉菜单。但是如果我能解决这个问题,我想我可以自己将代码修改成日历

必须手动添加javascript功能。相应的代码为:$'ID'。选择

为了获得需要添加的html代码,可以运行:WithTagsSelectInputId=mselect,label=multi,choices=letters[1:3],multiple=TRUE。您可以从那里提取所需的html部分

在docu中,您会发现可以使用JS交付javascript代码:JS中包装的字符选项将被视为文本javascript代码,而不是普通字符串

您希望在呈现select部分后添加javascript代码。使用initcomplete选项可以确保这一点

为了使用来自输入的值,必须将输入绑定到以下对象:

preDrawCallback = JS('function(){Shiny.unbindAll(this.api().table().node());}'),
drawCallback = JS('function(){Shiny.bindAll(this.api().table().node());}')
正如Remko提到的,他的链接帖子非常有用。几乎所有这些信息都可以在帖子中找到。创建一个可复制的示例可能需要一些闪亮方面的经验,因此我为您添加了一个:

可复制示例:


这看起来很有帮助:谢谢你,我已经看过这部电影了,我无法让它完成我想要的事情,尽管我真是太感谢你了!!你知道哪里有一个好的来源,让我了解更多关于这方面的闪亮?如果你还没有准备好,我相信我自己能找到。这是个好问题。我想这是一个混合体。在本例中,您可能有兴趣学习一些如何将数据表与javascript结合使用的示例。然后,重要的是要理解用户界面基本上是一个html页面:。提示:在控制台中输入ui变量。你学的东西越多,它就越容易;
library(shiny)
library(DT)

ui <- fluidPage(

  selectizeInput(
    inputId = "input",
    label = "",
    choices = letters[1:26],
    selected = letters[1]
  ),

  fluidRow(
    DTOutput(outputId = "table")
  )

)

#withTags(selectInput(inputId = "mselect", label = "multi", choices = letters[1:3], 
#    multiple = TRUE))
df <- data.frame(mselect = 
  '<select id="mselect" class="form-control" multiple="multiple">
     <option value="car">car</option>
     <option value="cars">cars</option>
     <option value="dog">dog</option>
  </select>'  
)


js <- c(
  "function(settings){",
  "  $('#mselect').selectize()",
  "}"
)

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

  observe({
    print(input$mselect)
  })

  output$table <- renderDT({

    datatable(
      data = df,
      escape = FALSE,
      options = 
        list(
          initComplete = JS(js),
          preDrawCallback = JS('function(){Shiny.unbindAll(this.api().table().node());}'),
          drawCallback = JS('function(){Shiny.bindAll(this.api().table().node());}')
      )
    )

  })

}

shinyApp(ui = ui, server = server)