使用 if 语句将 reactiveValue 的值传递到 observeEvent 以在闪亮中创建条件选项卡

pass value of reactiveValue into observeEvent with if statement to create conditional tabs in shiny

我正在尝试在闪亮的应用程序中创建动态选项卡
当用户输入 api 令牌时,用于 api 调用以生成 table

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

我在下面有一个基本的 reprex,它似乎不起作用。

如何将 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)

一些修改:

  1. 明确使用 id 参数 tabsetPanel
  2. observeEvent
  3. 中修改vals
  4. vals$a"" 进行比较而不是使用 is.null 因为 vals$a 在您的玩具示例中是一个字符串(您可以将 nrow(df)>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)