闪亮的UI模块问题:服务器模块没有使用反应式表达式更新选择

时间:2017-04-28 19:00:22

标签: r module shiny reactive

我在使用搜索过滤模块时遇到了很多麻烦。

我要在猫主人信息的大型数据库上运行统计数据。 我希望我的搜索模块根据猫品种列表中的选择显示可能的所有者列表(用户可以选择)。 我认为使用observe包装updateSelectInput并使用反应性cat owner表达式会在模块中实现这一点,但它不起作用(我无法猜测为什么会发生这种情况或如何调试它)。它适用于其他帖子([1]:R shiny passing reactive to selectInput choices,[2]:using values from a reactive input to directly input into a custom function

为什么我的selectInput不会与猫主人一起更新?

library(shiny)
df=data.frame(
  cat=c("tabby","DSH","MSH","LSH","DSH","MSH","LSH","sphinx"),
  owner=c("Foo","Bar","Bash","Foo","Foo","Foo","Bar","Bash"),stringsAsFactors = F)
refinedSearch<-function(input, output, session){
  ownsCat<-reactive({df[df$cat%in%input$cat,"owner"]})
  observe({updateSelectInput(session, "ownerSelected",
                             label ="Owned By",choices = ownsCat())})
  return()
}
refinedSearchUI<-function(id){
  ns <- NS(id)
  fluidRow(
    column(4,selectInput(ns("cat"),"Cat",selectize = T, 
                         choices =c("tabby","DSH","MSH","LSH","sphinx") )),
    column(4,selectInput(ns("ownerSelected"),"Owned By","",selectize = T))
  )
}
ui <- fluidPage(
  h1("Find cats owners"),
  fluidRow(column(10,offset=1, refinedSearchUI("tmp"))),
  fluidRow(column(10,offset=1, actionButton("addFilter","Add a Filter",
                                            icon = icon("plus"))))
)
server <- function(input, output,session) {
  refinedSearch(input,output,session)
  observeEvent(input$add, {insertUI(selector = "#addFilter",where = "beforeBegin",
                                    ui = refinedSearch(input,output,session))})
}
shinyApp(ui = ui, server = server)

谢谢你们的时间。

1 个答案:

答案 0 :(得分:1)

关于如何调用模块似乎有很多困惑。您需要在服务器中使用callModule()功能。此外,在插入UI时(使用insertUI()函数),您需要调用refinedSearchUI()函数,而不是refinedSearch()函数(同样应该始终通过{{1}调用所以它永远不应该像那样直接调用。)

我建议重新阅读the modules article

你也有拼写错误。 callModule()函数中的事件应该是observeEvent(),而不是input$addFilter(它不存在,因此观察者永远不会被解雇..)

如果您将服务器功能更改为此功能,您的应用将按预期运行:

input$add