我有一个闪亮的应用程序,它将SQL中的数据查询到数据框中,然后从我的shinyServer()块中引用这些数据框。到目前为止,我一直只在RStudio中运行它,因此每当我需要新数据时,我只需重新启动应用程序,在服务器加载之前,它将获取所有新数据。
我想将应用转换为闪亮的服务器,但我不确定如何诱导它定期获取新数据。为了界面,我希望它是自动的,而不是让用户点击按钮来启动加载。对此有没有惯用的解决方案?
编辑:
我想我找到了一个适合我的解决方案。
shinyServer(function(input,output,session){
sourceData <- reactive({
invalidateLater(1000000,session)
functionThatGetsData()
})
})
答案 0 :(得分:21)
如果您可以快速查询以检测是否有新数据,那么最聪明的可能是使用reactivePoll
。实际上,这对我来说非常好。
reactivePoll shiny
反应式轮询
说明
用于创建反应式数据源,通过定期轮询非反应式数据来工作数据源。
用法
reactivePoll(intervalMillis, session, checkFunc, valueFunc)
参数
intervalMillis
在调用
checkFunc
之间等待的大约毫秒数。他可以是数值,也可以是返回数值的函数。session
将此文件阅读器与之关联的用户会话,如果没有,则为
NULL
。如果非null,则读者将在会话结束时自动停止。checkFunc
一个相对便宜的函数,其值将随着时间的推移进行相等性测试; nequality表示基础值已更改,需要使用valueFunc
进行无效和重新填充。见详情。
valueFunc
计算基础值的函数。见详情。
答案 1 :(得分:9)
您正在寻找invalidateLater
。以适当的间隔将其放入从数据库中检索数据的反应式表达式中。
答案 2 :(得分:1)
我认为这些答案中的任何一个都不能完全回答OP的问题。具体来说
每当我需要新数据时,我都会重新启动应用程序 服务器加载它会抓取所有新数据。
表示需要刷新全局对象。如果多个用户同时与应用程序交互,那么在服务器函数内使用被动函数并不是解决该问题的一个很好的答案...所有这些都将尝试同时更新对象,这可能会也可能不会自行解决很好地取决于更新是什么(这是我正在积极努力的事情)。
我探索过的一个可能的解决方案是使用flock包让每个用户尝试获取全局临时文件的锁定,并且成功获取它的用户将负责执行全局更新。这直接解决了竞争条件。我没有完全测试它在这里作为解决方案发布它,也许其他人可以运行它。