为所有用户更新的响应式计时器Shiny r



我有一个闪亮的应用程序,从我的mongo数据库中提取数据,并以表格式显示。每隔30分钟,我的数据库中的数据就会发生变化。目前,每当有新用户登录时,都会为该用户提取数据。我想要的东西,缓存数据,但更新它每30分钟为所有用户。这样,每次有人登录的数据是不拉(慢,因为R是单线程)。下面是我目前拥有的一个例子。

library(shiny)

ui <- fluidPage(
titlePanel("Old Faithful Geyser Data"),

sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30)
),

mainPanel(
plotOutput("distPlot")
)
)
)
# create connection to mongo       
mongo.db = mongo(collection, db, url)
server <- function(input, output) {
#pull data from mongo
mydata = reactive({
df = mongo.db$find()
})

output$distPlot <- renderPlot({
mydata()
})
}
# Run the application 
shinyApp(ui = ui, server = server)

我想让它看起来像这样

library(shiny)

ui <- fluidPage(

titlePanel("Old Faithful Geyser Data"),

sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30)
),

mainPanel(
plotOutput("distPlot")
)
)
)
#create connection to mongo
mongo.db = mongo(collection, db, url)
#pull in data for all users after 30 minutes.
mydata = if(its been 30 minutes){ pull and cache data mongo.db} else {do nothing}
server <- function(input, output) {

output$distPlot <- renderPlot({
mydata()
})
}
# Run the application 
shinyApp(ui = ui, server = server)

##在看到Waldi的答案后编辑。该文件没有更新,即使我刚刚更新了密码数据库,是托管在mongo上。这个应用程序被托管在shinyapps.io

DBdata = passwords$find()
saveRDS(DBdata,'DBdata.rds')
mydata <- reactiveFileReader(interval = 1000 * 60 * 2, 
session = NULL,
'DBdata.rds',
readRDS)
# Define server logic required to draw a histogram
shinyServer(function(input, output, session) {

output$volscanner = renderDataTable(
mydata()
)
})

你可以把数据更新和数据使用分开。

数据更新

使用crontab定期运行数据更新脚本,参见此链接。
脚本应该从数据库读取数据并将结果保存在服务器上:

conn <- dbConnect(...)
DBdata <- dbGetQuery(conn,...)
saveRDS(DBdata,'dataDBdata.rds')

数据使用

server.R中使用多会话响应式文件读取器定期更新所有会话的数据:

mydata <- reactiveFileReader(interval = 1000 * 60 * 30, 
session = NULL,
'dataDBdata.rds',
readRDS)
server <- function(input, output) {
output$distPlot <- renderPlot({
mydata()
})
...
}

如果DB查询足够快,可以跳过数据更新部分,直接使用reactivePoll查询DB

相关内容

  • 没有找到相关文章