需要为来自 R Shiny 中的 Excel 工作表的 3 个 InsertUI 字段建立依赖关系

Posted

技术标签:

【中文标题】需要为来自 R Shiny 中的 Excel 工作表的 3 个 InsertUI 字段建立依赖关系【英文标题】:Need to build dependency for 3 InsertUI fields coming from Excel sheet in RShiny 【发布时间】:2020-10-04 04:50:31 【问题描述】:

我对 R 还很陌生,我正在尝试构建一个小型实用程序来供我学习。

我的 Excel 工作簿中有 3 个字段,名为:

国家 状态 城市

所有这些字段都应该在 UI 中作为下拉菜单出现。

我想要实现的是:'当我为国家/地区进行选择时,应该创建一个新的国家下拉列表,其中包含属于所选国家/地区的国家列表。并根据所选的州,下拉菜单中应填充基础城市'

我在网上找到了一些示例,但它们都创建了一个带有 3 个固定下拉菜单的静态 UI。如何动态实现?

下面的代码帮助我部分实现它,例如:如果我选择一个国家作为“印度”,它会根据使用的过滤器添加另一个下拉列表,其中包含所有州的正确列表。但是,一旦州被填充,即使我更改 Country 的选定值,它们也不会改变。

有人可以帮我解决吗?

library(shiny)
library(shinydashboardPlus)
library(shinydashboard)
library(shinyjs)
library(shinyWidgets)
library(tidyverse)
library(dplyr)
library(excelR)
library(readxl)
library(readr)

a<- read.excel("cities.xlsx")

ui<- fluidPage(
               titlePanel("Country Details"),
               fluidRow(column( width = 8,
                                div( 
                    textInput("message", label = "",placeholder = "Type your message here."),
                                          actionButton("send", "Send")
                                )
               )))

Server<- function ( input, output, session)


ObsereEvent(input$send, 
insertUI(selector#message", where = "beforeBegin",
                      ui=div(class="bubble",
                                 wellPanel(
                                   p( selectInput("country", "Country", choices =c("All",unique(as.character(a$Country) )), multiple = T) )))))

)
    observeEvent(input$country,
      insertUI(selector = "#message", where = "beforeBegin",
               ui=div( div(class="bubble",
                          wellPanel(
                            p(
                              selectInput("state", "State", choices =c(unique(as.character(a$State))[a$Country==input$country])) )
                          ))))

    )

observeEvent(input$state,
      insertUI(selector = "#message", where = "beforeBegin",
               ui=div( div(class="bubble",
                          wellPanel(
                            p(
                              selectInput("city", "City", choices =c(unique(as.character(a$city))[a$Country==input$country & a$state==input$state])) )
                          ))))

    )

 
ShinyApp( ui, server)

【问题讨论】:

【参考方案1】:

在您的服务器函数中,为您的国家/地区selectInput 添加一个observeEvent 侦听器。在其中,使用updateSelectInput 重新填充您的状态selectInput。同样,为您的州selectInput 编写一个observeEvent 侦听器以更新您的城市selectInput

除非重要的是在您选择国家/地区之前不会出现州 selectInput(以及在您选择州之前不会出现城市 selectInput,否则您应该能够执行所有这些操作而无需使用insertUIrenderUI。在updateSelectInput上搜索帮助。网上有很多例子。

无法为您提供解决方案,因为您没有为我们提供一个简单、独立的问题示例。这将包括玩具输入数据、您的代码、任何错误消息和预期输出。 This post 可能会有所帮助。

【讨论】:

对不起。我现在已将代码添加到问题中。你现在能帮帮我吗?【参考方案2】:

我的查询是一样的-

我的代码在下面-

我想根据第一个选择输入(文凭)的选择过滤数据。即,如果我选择任何文凭课程,我将在 available1 选择 Input 中获取过滤后的数据。

我的代码是-

ui<- fluidPage(useShinyjs(),
               #extendShinyjs(text = "shinyjs.button = function() window.scrollTo(0, 50);"),
               tags$head(tags$link(rel="stylesheet", href="style.css")),
               titlePanel("Chatbot"),
               fluidRow(column( width = 8,
                                div(id='outDiv',

                                    panel(style = "overflow-y:scroll; max-height: 300px; position:relative; align: centre",
                                          textInput("message", label = "",placeholder = "Type your message here."),
                                          actionButton("send", "Send"), heading = "Smart Advisor", status = "primary")
                                )
               )))


server<- function(input, output, session)



  # Declaring and Initializing Global Variables
  i <- 1
  lvl <- reactiveVal()
  lvl(i)

replyMessage<- function(lvl,msg)
  
    message('Level:', lvl)
    message('Message:', msg)

    switch(lvl,

if(msg=='Diploma')
           
             insertUI(selector = "#message", where = "beforeBegin",
                      ui=div(class="chat-bubbles",
                             div(class="bubble",
                                 wellPanel(
                                   p("As per your selection you are eligible for:", tags$br(),
                                     selectInput("diploma_courses", "Disciplines", choices =c("All",unique(as.character(a1$`Discipline Category1`) )),
                                                 multiple = T)

                                   )))))

             observeEvent(input$diploma_courses,
               insertUI(selector = "#message", where = "beforeBegin",
                        ui=div(class="chat-bubbles",
                               div(class="bubble",
                                   wellPanel(
                                     p(
                                       selectInput("available1", "Specialization", choices =c(as.character(a1$Subject1)[a1$`Discipline Category1`== input$diploma_courses])) )
                                   ))))

             )

 getMessage<- function(lvl)
  
    # Observer Event for Message Box
    observeEvent(input$send,
      if(input$message == '')
      
        insertUI(
          selector = "#message",
          where = "beforeBegin",
          ui=div(class="chat-bubbles",
                 div(class="bubble",p("Kindly provide a valid input."))
          )
        )
        clearInput()
      
      else
      
        replyMessage(lvl(),input$message)
      

    )
Solution

【讨论】:

以上是关于需要为来自 R Shiny 中的 Excel 工作表的 3 个 InsertUI 字段建立依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

在Shiny应用程序中读取read_excel中的特定工作表

R shiny 中的级别替换创建两个级别列表,一个为 NULL

Shiny 应用程序 (R) 中的交互式目录输入

如何在 Shiny 中引用 ui.R 中的反应元素

R Shiny 加速数据加载

R Shiny checkboxGroupInput - 基于不同组合的动作?