当使用renderUI"运行下面的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()
比当前的实现更有效,因为您只在循环结束时绑定一次数据帧,而不是在每次迭代时绑定一次。对于像这样的玩具示例来说,这不是问题,但在实际使用中可能很重要。