在R shiny 中,为什么简单适配renderUI 后会报错?
In R shiny, why am I getting an error message after making simple adaptation to renderUI?
当 运行 下面的“MWE 代码使用 renderUI”时,在 R studio 控制台中我收到消息“:: 长度为 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
不存在。确切的原因可能太复杂而无法解决。但我们不需要 - 修复很简单:add
req(input$samples)
在您 renderPlot()
.
的开头
顺便说一句,
v <- lapply(
1:numScenarios$numS,
function(i) tibble(Scenario=i,X=1:input$samples,Y=runif(input$samples))
) %>%
bind_rows()
比您当前的实现更有效,因为您只在循环结束时绑定一次数据帧,而不是在每次迭代时绑定一次。这对于像这样的玩具示例来说不是问题,但在实际使用中可能很重要。
当 运行 下面的“MWE 代码使用 renderUI”时,在 R studio 控制台中我收到消息“:: 长度为 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
不存在。确切的原因可能太复杂而无法解决。但我们不需要 - 修复很简单:add
req(input$samples)
在您 renderPlot()
.
顺便说一句,
v <- lapply(
1:numScenarios$numS,
function(i) tibble(Scenario=i,X=1:input$samples,Y=runif(input$samples))
) %>%
bind_rows()
比您当前的实现更有效,因为您只在循环结束时绑定一次数据帧,而不是在每次迭代时绑定一次。这对于像这样的玩具示例来说不是问题,但在实际使用中可能很重要。