R Shiny Stop для пользовательского ввода и отображения всех графиков - PullRequest
0 голосов
/ 12 июня 2019

У меня есть скрипт, который я хочу добавить в свое приложение 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 голосов
/ 13 июня 2019

Возможно, это то, что вы хотите. req используется только для отображения, когда переменная доступна. Вам необходимо создать второй 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)
}
0 голосов
/ 12 июня 2019

Если честно, я не уверен на 100%, знаю ли я, что вы ожидаете, даже после прочтения вашего текста 5 раз. У меня есть предположение; -).

Ваша pause функция, которая заставляет графики отображать один шаг за другим, может быть сделана с помощью invalidateLater. Это должно "жить" внутри реактивного значения. Я не знаю точно, кто является создателем этой функции, я сохранил ее в своих отрывках (слава неизвестному человеку).

Чтобы отобразить график или запустить сценарий на основе ввода пользователя, попробуйте перехватить его с помощью оператора 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...