Как отобразить заданный по умолчанию график на www / до нажатия кнопки actionB R блестящий - PullRequest
0 голосов
/ 22 марта 2020

Вот пример кода для создания графика при нажатии кнопки actionButton.

shinyApp(
shinyUI(fluidPage(
    inputPanel( 
        numericInput("n", "n", 10),
        actionButton("update", "Update")
    ),
    plotOutput("plot")
)),

shinyServer(function(input, output) {
    values <- reactiveValues()
    values$data <- c()

    obs <- observe({
        input$update
        isolate({ values$data <- c(values$data, runif(as.numeric(input$n), -10, 10)) })
    }, suspended=TRUE)

    obs2 <- observe({
        if (input$update > 0) obs$resume()
    })

    output$plot <- renderPlot({
        dat <- values$data
        hist(dat)
    })
}) 

)

Я хотел бы отобразить график по умолчанию, который отображается в www/test.png, когда приложение запущено. А затем измените график после нажатия кнопки actionButton в соответствии с пользовательским вводом.

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Ключ в том, чтобы использовать renderUI, чтобы вы могли показать изображение или график R. Это должно делать то, что вы хотите:

shinyApp(
  shinyUI(fluidPage(
    inputPanel( 
      numericInput("n", "n", 10),
      actionButton("update", "Update")
    ),
    uiOutput("out")
  )),

  shinyServer(function(session, input, output) {
    values <- reactiveValues()

    # check if plot has been already rendered
    check <- reactiveVal(FALSE)
    values$data <- c()

    observeEvent(input$update, {
      # set check to TRUE
      check(TRUE)
      input$update
      values$data <- c(values$data, runif(as.numeric(input$n), -10, 10))
      dat <- values$data
      output$plot <- renderPlot({
        hist(dat)
      })
    })

    # initial picture. 
    output$picture <- renderImage({
      list(src = "temp.png")
    }, deleteFile = FALSE)


    output$out <- renderUI({
      # in the  beginning, check is FALSE and the picture is shown
      if (!check()) {
        imageOutput("picture")
      } else {
        # as soon as the button has been pressed the first time,
        # the plot is shown
        plotOutput("plot")
      }


    })
  }) 

)
1 голос
/ 22 марта 2020

Сначала я создаю простой график, экспортирую его как изображение (вручную, а не в коде) и называю его Rplot.png (сохраните его там, где вы хотите):

plot(mtcars$mpg)

Затем в блестящее приложение, мы должны различать guish две ситуации:

  • когда приложение запускается, ни одна кнопка не нажата, мы визуализируем изображение с renderImage

  • когда мы нажимаем на кнопку, мы заменяем renderImage на renderPlot и визуализируем интерактивный сюжет

Это означает, что мы должны использовать uiOutput в ui части, чтобы мы могли выбрать вывод для изображения или графика в зависимости от ситуации.

Вот пример (я не адаптировал ваш код, но он не должен быть слишком сложным) :

library(shiny)

# determine your path to image here (you should use the package "here" to do so)

ui <- fluidPage(
  selectInput("choice", "Choose", choices = names(mtcars)),
  actionButton("run", "Run"),
  uiOutput("some_ui")
)

server <- function(input, output, session) {

  ### "Static" part: no click on actionButton yet
  output$some_ui <- renderUI({
    imageOutput("image_plot")
  })

  output$image_plot <- renderImage({
    list(src = "Rplot.png",
         contentType = 'image/png')
  }, deleteFile = FALSE) # Do not forget this option



  ### Click on actionButton
  observeEvent(input$run, {
    output$some_ui <- renderUI({
      plotOutput("dynamic_plot")
    })

    output$dynamic_plot <- renderPlot({
      plot(mtcars[[input$choice]])
    })
  })

}

shinyApp(ui, server)
...