如何解决在Shiny R中绘制图形;使用重复循环绘制数据以进行自动分析
编辑
我正在构建一个闪亮的应用程序,它的组件之一将包括自动数据分析。我的主要用途是访问API以收集数据并对其进行后续分析。此操作在define([
'jquery','bootstrapTable','bootstrapTableLocale'
],function($,bootstrapTable,bootstrapTableLocale) {
...
循环内发生,延迟5分钟(尽管可以由应用的用户指定)。延迟结束后,将再次访问API,然后重新开始该过程。在我将地块/表格作为列表返回到主控制台中的同时,这对我来说非常有用。
但是,我无法在Shiny应用程序中执行它。我无法提供API信息,但是出于所有意图和目的,这是一个使用repeat
数据集的可复制示例。
下面是使用动作按钮且不使用重复循环的情况下生成图的示例。每次单击操作按钮,图形都会以当前系统时间更新:
以及生成此代码的代码:-
mpg
但是,当我使重复循环生效时,可以使用UI中的数字输入来切换间隔计时器,则它不再起作用。这是无效的代码:-
library(shiny)
library(ggplot2)
ui<-fluidPage(
titlePanel('Minimal example'),tabsetPanel(
tabPanel("Example",#summary
sidebarPanel(width = 4,h5("The default interval for the analysis refresh is 5 minutes. If you wish to change this,please do so in the box below:"),numericInput("intervaltime","Input refresh interval:",5),br(),h5("Press 'Run Analysis' button below to start automated analysis"),actionButton("automatedanalysis","Run Analysis")),mainPanel(
h4("An example plot"),plotOutput("example_plot",width = "100%"),h4("Some text with updated system time"),textOutput("example_text")
)
)))
server<-function(input,output,session){
observeEvent(input$automatedanalysis,{
#interval=input$intervaltime*60
#repeat{
currenttime<-Sys.time()
p<-ggplot(mpg,aes(displ,hwy,colour = class)) +
geom_point()+ggtitle(paste0("graph made at: ",currenttime))# adds on the current time
output$example_plot<-renderPlot({
return(p)
})
output$example_text<-renderText({
print(paste0("The current system time is: ",Sys.time())) #a check to know that it is working
})
#Sys.sleep(interval)
#}
})
}
shinyApp(ui,server)
没有图形或文本输出出现。
再一次,这在Shiny App之外仍然可以正常工作,但是我需要此作为我正在开发的Shiny App中的功能。
总而言之,如何使它起作用,以便在单击操作按钮时,在间隔时间结束后刷新分析?
解决方法
您应该看看invalidateLater
或reactiveTimer
函数。
在以下示例中,我使用invalidateLater
(注意:该函数将毫秒作为第一个参数)。
您也不应在观察者内部放置任何输出,也不应该创建reactiveVal
/ reactiveValues
对象,并在每个新间隔内填充该对象。然后,您可以在应用程序中的任何位置使用该对象。
我还将observeEvent
更改为普通的observe
,因为否则它将仅在单击按钮时触发。现在,当单击“按钮”时,观察者将触发,间隔滑块会更改,并且间隔会过去。
library(shiny)
library(ggplot2)
ui<-fluidPage(
titlePanel('Minimal example'),tabsetPanel(
tabPanel("Example",sidebarPanel(width = 4,h5("The default interval for the analysis refresh is 5 minutes. If you wish to change this,please do so in the box below:"),numericInput("intervaltime","Input refresh interval:",5),br(),h5("Press 'Run Analysis' button below to start automated analysis"),actionButton("automatedanalysis","Run Analysis")),mainPanel(
h4("An example plot"),plotOutput("example_plot",width = "100%"),h4("Some text with updated system time"),textOutput("example_text")
)
)))
server<-function(input,output,session){
rv <- reactiveVal(NULL)
observe({
interval = input$intervaltime*1000
invalidateLater(interval,session)
req(input$automatedanalysis)
print("Fill ReactiveVal")
mpg$hwy <- mpg$hwy * runif(nrow(mpg))
rv(mpg)
})
output$example_plot<-renderPlot({
req(rv())
currenttime<-Sys.time()
print("Plot Code")
ggplot(rv(),aes(displ,hwy,colour = class)) +
geom_point()+ggtitle(paste0("graph made at: ",currenttime))
})
output$example_text<-renderText({
print(paste0("The current system time is: ",Sys.time())) #a check to know that it is working
})
}
shinyApp(ui,server)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。