【问题标题】:R Shiny: Conditional actionButton within uiOutputR Shiny:uiOutput 中的条件操作按钮
【发布时间】:2021-06-17 05:56:40
【问题描述】:

我有两个actionButtons 允许在数字 1-6 中导航。但是,我希望仅在显示数字 1 时删除“后退”按钮(但否则保留),并在数字 6 上删除“下一步”按钮(并保留在数字 1-5 中),以便提供关于序列开始和结束的视觉辅助。

请在底部查看我不成功的代码(#commented out 因为它会阻止成功过渡到数字 2-5)。

如何有条件地渲染这些按钮?

library(shiny)
library(shinyWidgets)



ui <- fluidPage(
  
  fluidRow(
    div(column(5,uiOutput("back"),align= "right")),
    div( column(5,uiOutput("next_q")),align = "left")),
  fluidRow(  
    column(5,offset = 3,id = "qa1", uiOutput("ui_q1"),br(),br(),
    )),
)

server <- function(input, output, session) {
  qbank=reactive(as.vector(c(1,2,3,4,5,6)))

  
  values <- reactiveValues()
  values$count <- 1
  myReactives <- reactiveValues(reactInd = 0)
  
  observe({
    input$next_q
    myReactives$reactInd <- 1
  })
  
  observe({
    input$back
    myReactives$reactInd <- 2
  })
  
  
  ntext <- eventReactive(input$next_q,{
    if(values$count != length(qbank())){
      values$count <- values$count + 1
      return(qbank()[values$count])
    }
    else{
      return(qbank()[length(qbank())])
    }
  })
  
  
  btext <- eventReactive(input$back,{
    if(values$count != 1){
      values$count <- values$count - 1
      return(qbank()[values$count])
    }
    else{
      return(qbank()[1])
    }
  })
  
  q <- reactive({
    if(input$next_q == 0){
      return(qbank()[1])
    }
    else if(myReactives$reactInd==1) return(
      ntext())
    else if(myReactives$reactInd==2)return(
      btext())
  })  
  
  q1 = reactive((q()[1]))
  output$q1 = renderText(q1())
  output$ui_q1 = renderUI(textOutput("q1"))
  
  
  output$back = renderUI({
    
    ## I cannot get the following if statement to function correctly
   # if(values$count==1) return (NULL)
   # else
      (actionButton("back","back"))})
  
  
  output$next_q = renderUI(    
    
    ## I cannot get the following if statement to function correctly
   # if(values$count==length(qbank()))
   # return (NULL)
   # else
      actionButton("next_q","next"))
}

shinyApp(ui, server)

谢谢

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我构建了一个玩具示例,演示如何在 1 时删除后退按钮,并在 6 时删除下一个按钮。从这个工作示例中,您可以调整代码以类似方式工作:

    library(shiny)
    
    ui <- fluidPage(
    
        fluidRow(column(12,align="center",textOutput("currentNum"))),
        fluidRow(
            column(6,align="right",uiOutput("backBut")),
            column(6,align="left",uiOutput("nextBut"))
        )
        
    )
    
    server <- function(input, output) {
        
        rv <- reactiveValues(currPage=1)
        
        observeEvent(input$backButton,{
            rv$currPage <- rv$currPage - 1
        })
        
        observeEvent(input$nextButton,{
            rv$currPage <- rv$currPage + 1
        })
        
        output$currentNum <- renderText({rv$currPage})
        
        output$backBut <- renderUI({
            if(rv$currPage>1){
                actionButton("backButton","< Back")
            } 
        })
        
        output$nextBut <- renderUI({
            if(rv$currPage<6){
                actionButton("nextButton","Next >")
            } 
        })
       
    }
    
    shinyApp(ui = ui, server = server)
    
    

    【讨论】:

    • 太棒了。完美运行。谢谢你,@Baroque。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2016-08-16
    相关资源
    最近更新 更多