R Shiny - 在第一次渲染时生成 observeEvent 图但有 "req" 语句

RShiny - Generating observeEvent plot on first render BUT have "req" statement

我有一个情节,每次按下操作按钮时都会自行刷新。我希望在第一次渲染时显示该图,即。当用户第一次导航到该页面时。目前必须在显示图之前按下操作按钮。

但是,ignoreNULL 在这里不起作用。我有一个 req 语句,出于某种原因否定了 ignoreNULL 的效果。我在下面有一个简单的可重现示例用于调试。

library(shiny)
library(data.table)
library(ggplot2)


ui <- fluidPage(
  
  sidebarLayout(
    
    sidebarPanel(
      
      uiOutput('inin'),
      actionButton(inputId = "trigger",
                   label = "Trigger", 
                   icon = icon("refresh"))
    ),
    
    mainPanel(
      plotOutput("outTable")
    )
    
  )
  
)



server <- function(input, output){
  
  output$inin = renderUI(selectInput(inputId = 'ins', label='hi', choices=c('x','y')))
  
  re <- eventReactive(input$trigger, {
    
    req(input$ins)                             # This is absolutely required for my app
    
    a = data.table(x = c("a", "b"), y = round(runif(2),2))
    
    return(a)
    
  }, ignoreNULL = F)
  
  output$outTable <- renderPlot({
    ggplot(re(), aes(x=y)) + geom_histogram()
  })
  
}

shinyApp(ui, server)

有办法解决吗?注释掉 req 语句可能很诱人,但对于实际的应用程序(不是这个例子),我必须拥有它,否则图表将 运行 出现错误问题,例如“参数长度为零”。

谢谢

也许您可以在按下操作按钮之前使用 non-reactive data.table,如下所示。

server <- function(input, output){
 
  output$inin = renderUI(selectInput(inputId = 'ins', label='hi', choices=c('x','y')))
  
  re1 <- data.table(x = c("a", "b"), y = round(runif(2),2))

  re <- eventReactive(input$trigger, {
    
    req(input$ins)                             # This is absolutely required for my app
    
    a = data.table(x = c("a", "b"), y = round(runif(2),2))
    
    return(a)
    
  }, ignoreNULL = F)
  
  output$outTable <- renderPlot({
    if (input$trigger==0) df <- re1
    else df <- re()
    ggplot(df, aes(x=y)) + geom_histogram()
  })
  
}