0

这是一个在单击 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 后更改绘图。

4

3 回答 3

1

首先,我创建一个简单的绘图,将其导出为图像(手动,而不是在代码中)并命名Rplot.png(将其保存在您想要的位置):

plot(mtcars$mpg)

然后,在闪亮的应用程序中,我们必须区分两种情况:

  • 当应用程序启动时,还没有点击任何按钮,我们渲染图像renderImage

  • 当我们点击按钮时,我们替换renderImagerenderPlot并渲染一个交互式绘图

这意味着我们必须使用部分uiOutputui以便我们可以根据情况选择输出为图像或绘图。

这是一个示例(我没有调整您的代码,但应该不会太难):

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)
于 2020-03-22T15:39:48.547 回答
1

关键是使用 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")
      }


    })
  }) 

)
于 2020-03-22T16:22:00.220 回答
0

我知道,这已经解决了一段时间,但我需要一个没有 uiOutput 的解决方案。另外,我发现这要简单得多。

library(shiny)

if (interactive()) {
  shinyApp(
    ui = fluidPage(
      actionButton("btn", "Click me"),
      br(),
      plotOutput('some_plot', width = '100%')
    ),
    server = function(input, output) {
      output$some_plot <- renderPlot({
        if (!input$btn) {
          # default plot
          plot(1, 1, col = 'red')
        } else{
          # updated plot
          plot(1000, 1000, col = 'green')
        }
      })
    }
  )
}
于 2020-12-11T10:15:42.760 回答