我有一个闪亮的应用程序,从我的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