在R闪亮,为什么我得到一个错误信息后,使简单的适应renderUI?



当使用renderUI&quot运行下面的MWE代码时,在R studio控制台我得到消息"Error in:: argument of length 0"尽管应用程序一直正常工作。这个MWE反映了对下面的">MWE代码的简单改编",这是在没有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)

这是一个"调度问题"。对于renderUI(),当调用renderPlot()时,input$samples不存在。确切的原因可能太复杂了,很难弄清楚。但是我们不需要这样做——修复方法很简单:添加

req(input$samples)

在你的renderPlot().

顺便说一下,

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

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

相关内容

最新更新