我正在尝试创建一个程序的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)
答案 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
,然后功能顺序无关紧要,因为文本更改会触发图形。取决于你的实际目标。