3

当运行以下“使用 renderUI 的 MWE 代码”时,在 R Studio 控制台中我收到消息“错误在 :: 长度为 0 的参数中”,尽管应用程序保持正常工作。此 MWE 反映了以下“ MWE code this was modified from without renderUI ”的简单改编,其中未使用 renderUI,并且此 MWE 不显示任何类型的错误。

什么可能导致此错误?我需要renderUI

使用 renderUI 的 MWE 代码:

 library(shiny)
    library(tidyverse)
    library(ggplot2)
    
    ui <- fluidPage(
      sidebarLayout(sidebarPanel(uiOutput("panel")),
      mainPanel(plotOutput("plot")),
    ))
    
    server <- function(input, output, session) {
      
      output$panel <- renderUI({
        tagList(
          sliderInput('samples','Number of samples (X):',min=2,max=10,value=10),
          actionButton("add", "Add scenario")
        )
      })
      
      numScenarios <- reactiveValues(numS=1)
      
      observeEvent(input$add, {showModal(modalDialog(footer = modalButton("Close")))
        numScenarios$numS <- (numScenarios$numS+1)
      })
      
      output$plot <- renderPlot({
        v <- tibble()
        for (i in 1: numScenarios$numS){
          results=tibble(Scenario=i,X=1:input$samples,Y=runif(input$samples))
          v <- bind_rows(v, results)
        }
        v %>% ggplot() + geom_line(aes(x=X, y=Y, colour=as.factor(Scenario)))
      })
    }
    
    shinyApp(ui, server)

这是改编自没有 renderUI 的 MWE 代码:

ui <- fluidPage(
  sliderInput('samples','Number of samples (X):',min=2,max=10,value=10),
  actionButton("add", "Add scenario"),
  plotOutput("plot"),
)

server <- function(input, output, session) {
  
  numScenarios <- reactiveValues(numS=1)
  
  observeEvent(input$add, {showModal(modalDialog(footer = modalButton("Close")))
    numScenarios$numS <- (numScenarios$numS+1)
  })
  
  output$plot <- renderPlot({
    v <- tibble()
    for (i in 1: numScenarios$numS){
      results=tibble(Scenario=i,X=1:input$samples,Y=runif(input$samples))
      v <- bind_rows(v, results)
    }
    v %>% ggplot() + geom_line(aes(x=X, y=Y, colour=as.factor(Scenario)))
  })
}

shinyApp(ui, server)
4

1 回答 1

3

这是一个“调度问题”。With renderUI(),调用input$samples时不存在。renderPlot()究竟为什么可能太复杂而无法解决。但我们不需要 - 修复很简单:添加

req(input$samples)

在您的renderPlot().

顺便一提,

v <- lapply(
        1:numScenarios$numS,
        function(i) tibble(Scenario=i,X=1:input$samples,Y=runif(input$samples))
     ) %>%
     bind_rows()

比您当前的实现更有效,因为您只在循环结束时绑定数据帧一次,而不是在每次迭代时绑定一次。对于像这样的玩具示例来说,这不是问题,但在现实世界的使用中可能很重要。

于 2021-10-12T08:49:30.010 回答