【问题标题】:pass value of reactiveValue into observeEvent with if statement to create conditional tabs in shiny使用 if 语句将 reactiveValue 的值传递给 observeEvent 以在闪亮中创建条件选项卡
【发布时间】:2021-04-03 17:15:00
【问题描述】:

我正在尝试在闪亮的应用程序中创建动态选项卡
当用户输入一个api token,用于api调用生成表

如果api调用成功,我想显示标签1和2
但是,如果 api 调用不成功或显示错误,我想隐藏选项卡 1 和 2

我在下面有一个基本的代表,这似乎不起作用。

如何将 reactiveVal 的值传递给 if 语句?具体来说,如果 reactiveValue 尚不存在,我如何在 if 语句中检查这一点?可能是 validate(need()) 的某个版本?

感谢您的帮助

library(shiny)



ui <- function() {
  fluidPage(
  tabsetPanel("mytabs", 
          type = "tabs", 
          
          tabPanel("home", 
                   
                   textInput("enterval", label = "enterval"
                             
                   )
          ), 
          tabPanel("tab1"), 
          tabPanel("tab2")
          
  )
)
}

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

  vals <- reactiveValues(

    a = NULL

  )

  vals$a <- eventReactive(input$enterval, {

# in reality, an api call creates an object (dataframe) when input$enterval is filled with a correct token
return(input$enterval)

  })

  observeEvent(input$enterval, {

if(is.null(vals$a()) # OR ERROR IS RETURNED FROM API CALL (vals$a) (possible to use validate(need()) here?)
   
   ) {
  
  hideTab(inputId = "mytabs", target = "tab1")
  hideTab(inputId = "mytabs", target = "tab2")
  
  
} else {
  
  showTab(inputId = "mytabs", target = "tab1")
  showTab(inputId = "mytabs", target = "tab2")
  
  
    }

  })

}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny shiny-reactivity


    【解决方案1】:

    一些修改:

    1. tabsetPanel 明确使用id 参数
    2. observeEvent 内修改vals
    3. vals$a"" 进行比较,而不是使用is.null,因为在您的玩具示例中vals$a 是一个字符串(您可以将nrow(df)&gt;0 用于数据帧)
    library(shiny)
    
    ui <- function() {
      fluidPage(tabsetPanel(id = "mytabs",
                            type = "tabs",
                            tabPanel("home",textInput("enterval", label = "enterval")),
                            tabPanel("tab1"),
                            tabPanel("tab2"))
      )
    }
    
    server <- function(input, output, session) {
    
      vals <- reactiveValues( a = NULL)
    
      observeEvent(input$enterval, {
    
        # in reality, an api call creates an object (dataframe) when input$enterval is filled with a correct token
        vals$a <- input$enterval
    
      })
    
      observeEvent(input$enterval, {
    
        if(vals$a =="" ) {
    
          hideTab(inputId = "mytabs", target = "tab1")
          hideTab(inputId = "mytabs", target = "tab2")
    
        } else {
    
          showTab(inputId = "mytabs", target = "tab1")
          showTab(inputId = "mytabs", target = "tab2")
    
        }
    
      })
    
    }
    
    shinyApp(ui, server)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-02
      • 2014-01-23
      • 2015-04-14
      • 2017-11-30
      • 1970-01-01
      • 2014-02-23
      • 2021-09-21
      相关资源
      最近更新 更多