【问题标题】:Using fluidRow with a conditional statement使用带有条件语句的fluidRow
【发布时间】:2021-01-27 06:18:44
【问题描述】:

以下应用会根据所选变量的数量生成动态 UI。 A problem is that when the number of variables selected is odd, the app generates an extra UI that is not tied to any of the variables previously selected.我尝试在fluidRow 创建语句中包含if 语句,主要是检查是否有余数,如果有,我试图告诉应用程序插入一个空格,但这并不能解决问题。有人对如何解决此问题有任何建议吗?

## libraries
library(tidyverse)
library(shiny)

ui <- fluidPage(
  selectInput(inputId = "var",
                 label = "vars:",
                 choices = colnames(mtcars),
                 multiple = TRUE),
  uiOutput("dynUI")
)

server <- function(input, output, session) {
  output$dynUI <- renderUI({
    row_idx <- length(input$var) %>% seq_len
    row_idx <- row_idx[row_idx %% 2 == 1]
    row_idx %>% 
      map(~fluidRow(column(width = 2, 
                           selectizeInput(inputId = paste0("var", .x), 
                                          label = paste(input$var[.x], "var:"),
                                          choices = c("this", "that"),
                                          multiple = FALSE)),
                    column(width = 2,
                           selectizeInput(inputId = paste0("var", .x + 1), 
                                          label = paste(input$var[.x + 1], "var:"),
                                          choices = c("this", "that"),
                                          multiple = FALSE))))
  })
}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    像下面这样的呢?

    library(tidyverse)
    library(shiny)
    
    column2 = function(x, input) {
      column(
        width = 2,
        selectizeInput(
          inputId = paste0("var", x), 
          label = paste(input$var[x], "var:"),
          choices = c("this", "that"),
          multiple = FALSE
        )
      )
    }
    
    ui <- fluidPage(
      selectInput(inputId = "var",
                  label = "vars:",
                  choices = colnames(mtcars),
                  multiple = TRUE),
      uiOutput("dynUI")
    )
    
    server <- function(input, output, session) {
      
      output$dynUI <- renderUI({
        row_idx <- length(input$var) %>% seq_len
        row_idx <- split(row_idx, (seq(row_idx) - 1) %/% 2)
        map(row_idx, function(x, input) fluidRow(map(x, column2, input = input)), input = input)
      })
    }
    
    shinyApp(ui, server)
    
    

    编辑:

    【讨论】:

      【解决方案2】:

      您可以使用is.na(input$var[.x + 1]) 检测奇数变量,然后将其跨越 4 列,如下所示:

      row_idx %>%
        map( ~ {
          if (!is.na(input$var[.x + 1]))
            fluidRow(column(
              width = 2,
              selectizeInput(
                inputId = paste0("var", .x),
                label = paste(input$var[.x], "var:"),
                choices = c("this", "that"),
                multiple = FALSE
              )
            ),
            column(
              width = 2,
              selectizeInput(
                inputId = paste0("var", .x + 1),
                label = paste(input$var[.x + 1], "var:"),
                choices = c("this", "that"),
                multiple = FALSE
              )
            ))
          else
            fluidRow(column(
              width = 4,
              selectizeInput(
                inputId = paste0("var", .x),
                label = paste(input$var[.x], "var:"),
                choices = c("this", "that"),
                multiple = FALSE
              )
            ))
        })
      

      【讨论】:

      • Hey Hubert - 您非常有帮助的答案的一个后续问题。您是否知道是否有任何方法可以修改该代码,以便动态UI 选择器在添加和删除“vars”时保留其值?例如,如果为 'mpg var' 选择了 'that',则从 'vars' 多选中删除一个变量会导致 'map var' 默认返回为 'this'。根据阅读 Hadley 的 Mastering Shiny 一书,我知道这是使用隔离完成的,但我无法弄清楚正确的实现。
      • 嗨@DJC,我会将所选值存储在data.frame中,每次更改时都会将其用作重新创建时的首选。如果您需要更多帮助,请在此处发布新问题并在评论中引用它。
      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 2022-11-20
      • 2019-06-12
      • 2020-08-18
      • 2017-12-02
      • 2017-03-06
      相关资源
      最近更新 更多