R Shiny - 如何从反应函数内部的循环输出文本,该函数本身返回一个图形

时间:2015-05-08 20:42:56

标签: r shiny

我正在尝试创建一个程序的Shiny版本。

目前,当按下actionButton时,程序在循环内进行一些处理,然后输出图形。这很好。

我想要做的是让处理循环创建一个HTML输出块,它将改变每次迭代。完成后,应显示图表。

我在下面创建了简单的框架代码来演示我正在尝试做什么。它无法显示任何文本,产生错误消息:

  

func()中的错误:找不到对象'h'

有人可以指出我正确的方向吗?

谢谢。

app <- shinyApp(
  ui = fluidPage(
    fluidRow(  actionButton("go", "Go!") ),

    fluidRow(htmlOutput("html")),

    fluidRow(plotOutput('plot'))
 ),

server = function(input, output) {

  myPlot <- eventReactive(input$go, {

    for (i in 1:5){
      h <- HTML("some text to be displayed")

      cat(i) # outputs to the console, just for debugging

      Sys.sleep(1) # pause for 1 second
    }

    hist(runif(15))
  })

  output$html <- renderUI({ h }) # This doesn't produce any output

  output$plot <- renderPlot({ myPlot() }) # This displays a graph after the loop terminates
})


runApp(app)

1 个答案:

答案 0 :(得分:0)

您的问题是您正在尝试输出在被动上下文中更改的变量。这些变化超出了范围。你想要的是一个观察者,结合使用isolate来实现与eventReactive相同的东西,但是使用持久变量。

试试这个

app <- shinyApp(
  ui = fluidPage(
    fluidRow(  actionButton("go", "Go!") ),

    fluidRow(htmlOutput("html")),

    fluidRow(plotOutput('plot'))
  ),

  server = function(input, output) {
    theText <- reactiveValues(htmlVar = NULL)
    observe({
      input$go
      isolate({
        for (i in 1:5){
          theText$htmlVar <- HTML("some text to be displayed")

          cat(i) # outputs to the console, just for debugging

          Sys.sleep(.1) # pause for 100ms 
        }
      })
    })
    myPlot <- reactive({input$go
                        print("setting myPlot")
                        return (hist(runif(15)))
      })

    output$html <- renderUI({ theText$htmlVar }) 

    output$plot <- renderPlot({ return (myPlot()) }) # This displays a graph after the loop terminates
  })

runApp(app)

如果您在实际程序中一致地更改HTML输出,则可以将input$go中的myPlot替换为theText$htmlVar,然后功能顺序无关紧要,因为文本更改会触发图形。取决于你的实际目标。