gpt4 book ai didi

r - 使 Shiny 的应用程序 UI 依赖于 URL 参数

转载 作者:行者123 更新时间:2023-12-04 09:36:36 25 4
gpt4 key购买 nike

我想根据 URL 参数为我的应用程序创建替代 UI。具体来说,我想使用 shinyWidgets 的下拉 pickerInput 而不是 checkboxGroupInput,但前提是参数 mini=TRUE 通过 URL 传递

library(shinyWidgets)

nazwy=c('Warszawa', 'Krakow', 'Gdansk')

ui<-fluidPage(
if (mini) {
pickerInput(inputId = "miasto", choices = nazwy,multiple = TRUE)
} else {
checkboxGroupInput('miasto', nazwy)
})

我可以使用 conditionalPanel 以某种方式做到这一点,还是 renderUI 是我唯一的选择?

或者,我可以根据窗口宽度显示 pickerInput 或 checkboxGroupInput 吗?

更新

下面给出的选项 1 是对我最初的问题的有效答案,使 UI 依赖于 URL。对于这种特殊情况,选项 2 是更好的解决方案 - 使 UI 适应窗口大小。但是,要使选项 2 正常工作,需要另一个变量来存储选择,以便每次调整窗口大小时 select/pickerInput 都不会返回默认选择。我相应地编辑了代码。

最佳答案

以下四个选项:

  1. 依赖于 URL,renderUI
  2. 取决于窗口宽度,renderUI
  3. 取决于窗口宽度,conditionalPanel(不能正常工作)
  4. 取决于窗口宽度,shinyjs

选项1:依赖于URL,renderUI

可以让它依赖于 URL,例如参见 here .这是一个示例实现:

library(shinyWidgets)
library(shiny)

nazwy=c('Warszawa', 'Krakow', 'Gdansk')

ui<-fluidPage(
uiOutput('myUI')
)


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

output$myUI <- renderUI({
query <- parseQueryString(session$clientData$url_search)
if (!is.null(query$mini)) {
if(query$mini==TRUE)
{
pickerInput(inputId = "miasto", choices = nazwy,multiple = TRUE)
}
else
{
checkboxGroupInput('miasto', 'choose: ',nazwy)
}
}
else
{
checkboxGroupInput('miasto', 'choose: ',nazwy)
}
})
}

shinyApp(ui,server,options=list(port=7777))

同时尝试 http://127.0.0.1:7777/http://127.0.0.1:7777/?mini=TRUE


选项 2:取决于窗口宽度,renderUI

如果你想让它依赖于窗口宽度,这里有一个可能的解决方案:

library(shinyWidgets)
library(shiny)

nazwy=c('Warszawa', 'Krakow', 'Gdansk')

ui<-fluidPage(
tags$head(tags$script('
var dimension = [0, 0];
$(document).on("shiny:connected", function(e) {
dimension[0] = window.innerWidth;
dimension[1] = window.innerHeight;
Shiny.onInputChange("dimension", dimension);
});
$(window).resize(function(e) {
dimension[0] = window.innerWidth;
dimension[1] = window.innerHeight;
Shiny.onInputChange("dimension", dimension);
});
')),
uiOutput('myUI')
)


server <- function(input,output) {
output$myUI <- renderUI({
req(input$dimension)
if (input$dimension[1]<800) {
pickerInput(inputId = "miasto", choices = nazwy,
selected=isolate(selected_cities()),multiple = TRUE)
} else {
checkboxGroupInput('miasto', 'choose: ',
choices=nazwy, selected=isolate(selected_cities()))
}
})

#store selected value to pass on resizing
selected_cities<-reactive(input$miasto)

}

shinyApp(ui,server)

选项 3:窗口宽度 + 条件面板。注意:没有按预期工作。

   library(shinyWidgets)
library(shiny)

nazwy=c('Warszawa', 'Krakow', 'Gdansk')

ui<-fluidPage(
tags$head(tags$script('var dimension = [0, 0];
$(document).on("shiny:connected", function(e) {
dimension[0] = window.innerWidth;
dimension[1] = window.innerHeight;
Shiny.onInputChange("dimension", dimension);
});
$(window).resize(function(e) {
dimension[0] = window.innerWidth;
dimension[1] = window.innerHeight;
Shiny.onInputChange("dimension", dimension);
});
')),
conditionalPanel(condition = 'input.dimension[0]>1000',
pickerInput(inputId = "miasto", choices = nazwy,multiple = TRUE)
),
conditionalPanel(condition = 'input.dimension[0]<=1000',
checkboxGroupInput('miasto', 'choose: ',nazwy))
)


server <- function(input,output) {

}

shinyApp(ui,server)

方案四:窗口宽度+shinyjs

library(shinyWidgets)
library(shiny)
library(shinyjs)

nazwy=c('Warszawa', 'Krakow', 'Gdansk')

ui<-fluidPage(
tags$head(tags$script('var dimension = [0, 0];
$(document).on("shiny:connected", function(e) {
dimension[0] = window.innerWidth;
dimension[1] = window.innerHeight;
Shiny.onInputChange("dimension", dimension);
});
$(window).resize(function(e) {
dimension[0] = window.innerWidth;
dimension[1] = window.innerHeight;
Shiny.onInputChange("dimension", dimension);
});
')),
div(id='div1',pickerInput(inputId = "miasto", choices = nazwy,multiple = TRUE)),
shinyjs::hidden(div(id='div2',checkboxGroupInput('miasto', 'choose: ',nazwy))),
useShinyjs()
)


server <- function(input,output) {
observeEvent(input$dimension,ignoreNULL=T,{
if (input$dimension[1]>1000) {
shinyjs::show('div1')
shinyjs::hide('div2')
} else {
shinyjs::show('div2')
shinyjs::hide('div1')
}
})
}

shinyApp(ui,server)

关于r - 使 Shiny 的应用程序 UI 依赖于 URL 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48545659/

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