我有一个脚本要添加到我的Shiny应用程序中,原始脚本可以简化为以下内容:
plot(c(1:3),c(2,4,6), main ="This is first plot I want displayed")
a <- menu(c(1:5), title="what would you like to change the first point to?")
plot(c(1:3),c(a,4,6), main ="This is second plot I want displayed")
b <- menu(c(1:5), title="what would you like to change the second point to?")
plot(c(1:3),c(a,b,6), main ="This is second plot I want displayed")
上面的脚本绘制了第一个图表,然后等待用户输入,然后绘制第二个,然后再次等待用户输入,然后绘制第三个。
但是,当我尝试将其转换为闪亮的应用程序(如下所示)时,它永远不会更新第一个或第二个绘图,而我试图使其停止以供显示的用户输入无法正常工作。
>我尝试使用req(),但似乎完全停止了脚本,因此最后的东西根本不会运行,因此您必须重新启动整个脚本。
那么,如何使它按顺序显示所有绘图?如何使脚本停止并等待输入,然后继续?
if(interactive()){
ui <- fluidPage(
actionButton("button","Click me"),
selectInput("input", "Input", c(1:10)),
textOutput("text"),
plotOutput("plot")
)
server <- function(input, output) {
a<-1
observeEvent(input$button, {
output$plot <- renderPlot(plot(c(1:3),c(2,4,6), main ="This is first plot I want displayed"))
output$text <- renderText("Please select a number to multiply the first point with")
#This is where I want the script to wait for user input
output$plot <- renderPlot(plot(c((1),(2),(3)),c((input$input),(a),(3)), main="This is plot the second plot"))
a<-a+1
#Here I want the script to wait for user input again
output$plot <- renderPlot(plot(c((1),(2),(3)),c((input$input),(a),(3)), main="This is plot the third plot"))
})
}
shinyApp(ui=ui, server=server)
}
目标是在代码中绘制图形时更新图形,并等待用户输入直到脚本继续执行,而不是继续进行。
答案 0 :(得分:0)
说实话,即使阅读了5次文字,我也不确定100%是否知道您的期望。我有一个猜测;-)。
可以使用pause
完成invalidateLater
函数,该函数使绘图一步一步地渲染。这必须“存在” reactiveValue内部。我不知道是谁创建了此函数,我将其保存在摘要中(所有荣耀归于不知名的人)。
要根据用户的输入来绘制图或运行脚本,请尝试使用if
语句来捕获它。
希望这会有所帮助:-)。
library(shiny)
if(interactive()){
ui <- fluidPage(
selectInput("input", "Input", c(1:10)),
actionButton("apply", "Apply"),
textOutput("text"),
plotOutput("plot")
)
server <- function(input, output, session) {
rv <- reactiveValues(i = 0)
maxIter <- 10
observeEvent(input$apply, {
rv$i <- 0
observe({
isolate({
rv$i <- rv$i + 1
})
if (isolate(rv$i) < maxIter){
invalidateLater(2000, session)
}
})
})
output$plot <- renderPlot( {
if(rv$i > 0) {
if(input$input <= 4) {
plot(c((rv$i*1),(rv$i*2),(rv$i*3)),c((1),(2),(3)), main = sprintf("Input <= 4; Round %i", rv$i), type = "l")
} else {
plot(c((rv$i*1),(rv$i*5),(rv$i*4)),c((1),(2),(3)), main = sprintf("Input > 4; Round %i", rv$i), type = "l")
}
} else {
plot(c(1:3),c(2,4,6), main ="This is first plot")
}
})
}
shinyApp(ui=ui, server=server)
}
答案 1 :(得分:0)
也许这就是您想要的。
req
仅在变量可用时显示。由于无法在ui部分使用renderUI
,因此需要在服务器中创建第二个req
。
if(interactive()){
ui <- fluidPage(
plotOutput("plot1"),
numericInput ("num1", "Please select a number to multiply the first point with", NA, 1, 10),
plotOutput("plot2"),
uiOutput("num2"),
plotOutput("plot3")
)
server <- function(input, output) {
output$plot1 <- renderPlot(plot(c(1:3),c(2,4,6), main ="This is first plot I want displayed"))
output$plot2 <- renderPlot({
req(input$num1)
plot(c(1:3),c(2*(input$num1),4,(6)),
main="This is plot the second plot"
)
}
)
output$plot3 <- renderPlot({
req(input$num1, input$num2)
plot(c(1:3),c(2*(input$num1)+(input$num2),4,(6)),
main="This is plot the third plot"
)
}
)
output$num2 <- renderUI({
req(input$num1)
numericInput ("num2", "Please select a number to add to first point", NA, 1, 10)
})
}
shinyApp(ui=ui, server=server)
}