r - 根据对 Shiny 中上一个菜单的响应显示不同的选择菜单
问题描述
我正在尝试根据用户对上一个菜单的响应以闪亮的方式动态显示不同的选择菜单。例如,如果用户选择启动顺序的“竞选_id”,则应将下拉菜单带有适当的选项。但是,如果他们选择销售活动,他们应该获得折扣百分比的数字文本条目。我已经创建了所有合适的选择菜单,但现在我需要弄清楚如何动态显示它们。我尝试根据对上一个问题的响应使用 ifelse 逻辑,但它始终显示与所有错误响应关联的菜单。
我怀疑当逻辑评估先前的响应时,响应的格式不正确,或者其中有一些 html,因此逻辑总是评估为 false。我已经包含了一个我正在经历的简化示例。任何帮助是极大的赞赏。
library(shiny)
library(tidyverse)
# data referenced 1
cid <- tibble(
name = c(
'Free Content',
'Launch Sequence',
'Mega Sale',
'Sale Email',
'Sale Reminder',
'VSL Push'
),
abbr = c('FC',
'LS',
'MS',
'SE',
'SR',
'VP')
)
# data referenced 2
csid <- tibble(
name = c(
'Free Content',
'Launch Sequence',
'Launch Sequence',
'Launch Sequence',
'Launch Sequence',
'Launch Sequence',
'Mega Sale',
'Sale Email',
'Sale Reminder',
'VSL Push'
),
subname = c(
'topic text entry',
'Launch Sequence1',
'Launch Sequence2',
'Launch Sequence3',
'Launch Sequence4',
'Launch Sequence5',
'NA',
'discount numeric entry',
'NA',
'url'
),
abbr = c(
'NA1',
'LS1',
'LS2',
'LS3',
'LS4',
'LS5',
'NA2',
'NA3',
'NA4',
'NA5'
)
)
ui <- fluidPage(
titlePanel("Example Selection"),
sidebarLayout(
sidebarPanel(
selectInput(
inputId = 'campaign_id',
label = 'Campaign ID',
choices = c(cid$name)
),
uiOutput(ifelse(
# which selection menu to display based on campaign_id
'cid' == 'Launch Sequence',
'ls',
ifelse(
'cid' == 'Free Content',
'fc',
ifelse(
'cid' == 'Sale Email',
'se',
ifelse('cid' == 'VSL Push',
'vp',
'mssr')
)
)
)),
textInput(
inputId = 'date',
label = 'Launch Date',
placeholder = paste0('use date format "', Sys.Date(), '"')
)
),
############### Main panel for displaying outputs ----
mainPanel(
textOutput(outputId = "campaign_name"))
))
############## server functions --------------------------------------
server <- function(input, output) {
# build campaign sub-id list based on campaign selected ----
cidselected <- reactive({
input$campaign_id
})
output$cid <- renderText({
cidselected()
})
output$ls = renderUI({
selectInput(
inputId = 'campaign_subid',
label = 'Campaign Sub-ID',
choices = c(
'Launch Sequence1',
'Launch Sequence2',
'Launch Sequence3',
'Launch Sequence4',
'Launch Sequence5'
)
)
})
output$fc = renderUI({
textInput(inputId = 'campaign_subid',
label = 'Campaign Sub-ID',
placeholder = '1-3 word description of main topic')
})
output$vp = renderUI({
textInput(inputId = 'campaign_subid',
label = 'Campaign Sub-ID',
placeholder = 'enter VSL url here')
})
output$mssr = renderUI({
selectInput(inputId = 'campaign_subid',
label = 'Campaign Sub-ID',
choices = c('N/A'))
})
output$se = renderUI({
numericInput(
inputId = 'campaign_subid',
label = 'Campaign Sub-ID (enter as whole number 40% = 40)',
value = 0,
min = 0,
max = 100
)
})
output$campaign_name <-
renderText({
# display combined name with abbreviations
cid = cid$abbr[cid$name == input$campaign_id]
csid = input$campaign_subid
date = gsub('-', '', input$date, fixed = T)
paste(cid,
csid,
date,
sep = '-')
})
}
shinyApp(ui = ui, server = server)
解决方案
听起来您正在寻找条件面板。如果你有更多的输入选择/组合,还有更复杂的方法(你可以创建一个在 server.R 中动态创建的 uiOutput,例如),但这是做你想做的简单直接的方法。
推荐阅读
- python - ValueError:无法将字符串转换为浮点数:'01-01-20 0:15'
- highcharts - Highcharts - Highstock 图表在悬停数据点上显示双线以显示工具提示
- sql - 给所有月份的数字,这些数字在我的数据库中作为字符串,当用户选择任何月份时,下一行将自动填充
- c# - 如何使用 C# MongoDb 驱动程序更新深度嵌套数组中的“类型安全”字段?
- xcode - 命令代码符号失败,退出代码为非零 + onesignal + xcode 12.3
- ssl - 来自购买的通配符 SSL 的 Kubernetes SSL
- vue.js - 在 vuejs 的上下文中单击 chartjs 不会发生日期选择
- android - WebView 无法在浏览器和应用程序中打开链接
- javascript - Formik - 从两个单独的字段设置相同的字段值
- php - 与 Laravel spatie 包中的另一个需求冲突