R发光停止,供用户输入并显示所有图

时间:2019-06-12 13:13:46

标签: r shiny

我有一个脚本要添加到我的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)
}

目标是在代码中绘制图形时更新图形,并等待用户输入直到脚本继续执行,而不是继续进行。

2 个答案:

答案 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)
}