gpt4 book ai didi

r - Shiny:动态数据框构建; renderUI、观察、reactiveValues

转载 作者:行者123 更新时间:2023-12-02 03:27:30 25 4
gpt4 key购买 nike

我认为如何使用 Shiny 的 renderUI 功能动态子集数据的问题经常出现,但我很难理解何时使用 renderUI (带有 uiOutput)而不是其他功能,包括观察、 react 、 react 值甚至条件面板。

我想构建一个完全交互式的数据框架,其中每个选择都会影响您在其他输入中可以选择的内容。对于此示例,我们将有一个 selectInput(单个)、selectInput(多个)和一个 sliderInput(具有最大值和最小值)。

主要选择类别 1,可以是类别 1 中的任何值或“全部”。通过选择类别 1 中的某些内容,您可以反过来影响类别 2 中可以显示的内容以及 slider 上的值的范围。通过首先选择类别 2,您可以限制类别 1 的选项以及 slider 中的值(始终代表子集的最大值和最小值)。从 sliderInput 开始,如果类别 1 和类别 2 的数据都不落在您指定的范围内,则类别 1 和类别 2 受到限制。

注意我将合并一个“重置”操作按钮,将数据帧重置为应用程序初始化时的状态。

尝试使用一些虚拟数据,但我尚未成功。这将按类别 1 进行子集化并更新 slider ,但更改类别 2 不会覆盖渲染的表格;

require(shiny)

data <- data.frame(Category1 = rep(letters[1:3],each=15),
Info = paste("Text info",1:45),
Category2 = sample(letters[15:20],45,replace=T),
Size = sample(1:100, 45),
MoreStuff = paste("More Stuff",1:45))

ui <- fluidPage(

titlePanel("Test Explorer"),

sidebarLayout(
sidebarPanel(
uiOutput("category1"),
uiOutput("category2"),
uiOutput("sizeslider")
),
mainPanel(
tableOutput("table")
)
)
)

server <- function(input, output,session) {

df_subset <- reactive({
if(input$cat1=="All") {df_subset <- data}
else{df_subset <- data[data$Category1==input$cat1,]}

})

df_subset1 <- reactive({
if(is.null(input$cat2)){df_subset()} else {df_subset()[df_subset()$Category2==input$cat2,]}
})

output$category1 <- renderUI({
selectizeInput('cat1', 'Choose Cat 1', choices = c("All",sort(as.character(unique(data$Category1)))),selected = "All")
})

output$category2 <- renderUI({
selectizeInput('cat2', 'Choose Cat 2 (optional):', choices = sort(as.character(unique(df_subset1()$Category2))), multiple = TRUE,options=NULL)
})

output$sizeslider <- renderUI({
sliderInput("size", label = "Size Range", min=min(df_subset1()$Size), max=max(df_subset1()$Size), value = c(min(df_subset1()$Size),max(df_subset1()$Size)))
})

output$table <- renderTable({
df_subset1()
})

}

shinyApp(ui, server)

最佳答案

跟踪正在发生的事情有点棘手,但是,这是您想要的吗?请注意,将 reactive 更改为 eventReactive,因此它专门绑定(bind)到 input。我还使用 %in% 运算符为您的 selectizeInput 进行多项选择

编辑:在您的第一个代码中,您甚至不使用 slider ,我将其添加到过滤

#rm(list = ls())
library(shiny)

data <- data.frame(Category1 = rep(letters[1:3],each=15),
Info = paste("Text info",1:45),
Category2 = sample(letters[15:20],45,replace=T),
Size = sample(1:100, 45),
MoreStuff = paste("More Stuff",1:45))

ui <- fluidPage(

titlePanel("Test Explorer"),
sidebarLayout(
sidebarPanel(
uiOutput("category1"),
uiOutput("category2"),
uiOutput("sizeslider")
),
mainPanel(
tableOutput("table")
)
)
)

server <- function(input, output,session) {

output$category1 <- renderUI({
selectizeInput('cat1', 'Choose Cat 1', choices = c("All",sort(as.character(unique(data$Category1)))),selected = "All")
})

df_subset <- eventReactive(input$cat1,{
if(input$cat1=="All") {df_subset <- data}
else{df_subset <- data[data$Category1 == input$cat1,]}
})

df_subset1 <- reactive({
if(is.null(input$cat2)){df_subset()} else {df_subset()[df_subset()$Category2 %in% input$cat2,]}
})

output$category2 <- renderUI({
selectizeInput('cat2', 'Choose Cat 2 (optional):', choices = sort(as.character(unique(df_subset()$Category2))), multiple = TRUE,options=NULL)
})

output$sizeslider <- renderUI({
sliderInput("size", label = "Size Range", min=min(df_subset1()$Size), max=max(df_subset1()$Size), value = c(min(df_subset1()$Size),max(df_subset1()$Size)))
})

df_subset2 <- reactive({
if(is.null(input$size)){df_subset1()} else {df_subset1()[df_subset1()$Size >= input$size[1] & df_subset1()$Size <= input$size[2],]}
})

output$table <- renderTable({
df_subset2()
})
}

shinyApp(ui, server)

enter image description here

关于r - Shiny:动态数据框构建; renderUI、观察、reactiveValues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40864881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com