R 为所有用户更新的反应式计时器
我有一个闪亮的应用程序,可以从我的mongo数据库中提取数据并以表格格式显示。数据库中的数据每30分钟更改一次。目前,每次新用户登录时,都会为该用户提取数据。我想缓存数据,但每30分钟为所有用户更新一次。这样,每次有人登录数据时都不会被拉入(因为R是单线程的,所以速度很慢)。下面是我目前拥有的一个例子R 为所有用户更新的反应式计时器,r,caching,shiny,R,Caching,Shiny,我有一个闪亮的应用程序,可以从我的mongo数据库中提取数据并以表格格式显示。数据库中的数据每30分钟更改一次。目前,每次新用户登录时,都会为该用户提取数据。我想缓存数据,但每30分钟为所有用户更新一次。这样,每次有人登录数据时都不会被拉入(因为R是单线程的,所以速度很慢)。下面是我目前拥有的一个例子 library(shiny) ui <- fluidPage( titlePanel("Old Faithful Geyser Data"),
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)
库(闪亮)
ui您可以将数据更新和数据使用分开
数据更新
使用crontab
定期运行数据更新脚本,请参阅。
脚本应从数据库读取数据并将结果保存在服务器上:
conn <- dbConnect(...)
DBdata <- dbGetQuery(conn,...)
saveRDS(DBdata,'data\DBdata.rds')
如果数据库查询足够快,您可以跳过数据更新部分,使用reactivePoll
直接查询数据库。waldi感谢您的帮助!我将对此进行调查,并检查解决方案是否有效。瓦尔迪,我已经更新了我的问题。最后有一个编辑。我仍然有一些问题,passwords$find()
需要多少时间?这是一个很长的查询还是只需要几秒钟?我不确定是否可以在shinyapp.io上使用crontab
,因此我们必须使用reactivePoll.Waldi,使用reactivePoll是解决方案。谢谢,很高兴我能帮忙!另见新的。
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()
)
})
conn <- dbConnect(...)
DBdata <- dbGetQuery(conn,...)
saveRDS(DBdata,'data\DBdata.rds')
mydata <- reactiveFileReader(interval = 1000 * 60 * 30,
session = NULL,
'data\DBdata.rds',
readRDS)
server <- function(input, output) {
output$distPlot <- renderPlot({
mydata()
})
...
}