需要为来自 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
,否则您应该能够执行所有这些操作而无需使用insertUI
或renderUI
。在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中的特定工作表