【发布时间】:2019-12-16 01:33:13
【问题描述】:
正如标题所示,我希望创建一个动态创建的 UI 对象(使用 renderUI),以后可以在 Shiny App 中进一步操作。
在下面的代表中,我有一个玩具应用程序,它允许用户根据萼片宽度过滤iris 数据集。根据用户选择的范围,我会生成一个包含该萼片宽度范围内所有独特物种的复选框列表。
我的问题是:如何让应用程序告诉我在用户过滤表格后选择了哪个物种的复选框?例如,在默认的应用程序设置下,当萼片宽度范围在 1 到 2 之间时,只有一种物种满足过滤器要求(杂色)。当用户选中 versicolor 框时,我希望应用更新以告诉我已选择 versicolor。
同样,当萼片宽度范围更大时(然后动态生成的复选框列表中包含更多物种),我希望 UI 再次更新以告诉我选择了哪个物种(1、2 或所有 3 个物种)。
我脑海中的基本工作流程是:
(1) 用户过滤数据集 (2) 显示基于过滤器的表格更新 (3) 应用生成唯一物种的复选框列表 (4) 用户点击物种,物种名称显示在屏幕上。
library(shiny)
library(DT)
library(dplyr)
ui <- basicPage(
fluidRow(
uiOutput("ui"),
sliderInput("slider", "Sepal Width", min = 0, max=20, value=c(1:2)),
tableOutput("data")
),
)
server <- function(input, output){
data("iris")
filtered<-reactive({
iris %>% filter(`Sepal.Width` %in% input$slider[1]:input$slider[2])
})
output$data<-renderTable({
filtered()
})
output$ui<-renderUI({
species<-filtered()
checkboxGroupInput(inputId = 'occurence_checkboxes', label = 'Species', choices = unique(species$Species))
})
}
shinyApp(ui, server)
【问题讨论】:
-
您是否只是希望用户选择的物种名称出现在屏幕上?还是由用户对所选物种进行过滤?
-
最终目标是,一旦物种被过滤,下游代码将提取这些物种的观察记录并将其显示在地图上。由于这将在计算上相当昂贵,因此我不希望代码运行,除非用户明确想要查看这些物种的分布位置(通过选择所需的物种)。我希望能澄清一些事情。
标签: r shiny shiny-reactivity