我有一个闪亮的应用程序正在从一些文件加载数据。 在服务器上,在不中断的情况下更新这些文件的最佳方法是什么 服务器?
在网上搜索,我找到了这两个解决方案:
1)使用reactiveValues()
或values <- reactiveValues()
updateData <- function() {
vars <- load(file = "my_data_frame.RData", envir = .GlobalEnv)
for (var in vars)
values[[var]] <- get(var, .GlobalEnv)
}
updateData() # also call updateData() whenever you want to reload the data
output$foo <- reactivePlot(function() {
# Assuming the .RData file contains a variable named mydata
plot(values$mydata)
}
http://shiny.rstudio.com/gallery/reactive-poll-and-file-reader.html
2)使用{{1}}
Update a data frame in shiny server.R without restarting the App
{{1}}
重新加载以闪亮方式加载的文件的最佳做法是什么?
感谢您的任何意见!
答案 0 :(得分:2)
让我尝试重新定位您的问题,定位您所指的一些纸张/示例代码。
在非常高的水平(即不必过多担心反应性),R + shiny
与作为ETL过程的一部分处理数据的标准方法不同(例如)。
即。您可以在闪亮服务器中加载以下类型的外部数据之一:
让我们首先谈谈第一个案例的不同变种,静止的数据:
server <- function(input, output, session) {
---
output$foo <- reactivePlot(function() {
someQuery <- dbGetQuery(...) # some query of a database
plot(values$mydata)
}
---
}
上面的代码每次执行被动功能时都会运行查询。
这就是反应性有用的地方:例如,没有其他变化,上面的代码将为连接到应用程序的每个用户执行一次。
如果基础数据经常被外部流程更新,则不同用户的结果可能会有所不同。
此外,任何导致反应构造重新执行的东西也会重新执行查询(例如,只需刷新浏览器,重新执行查询,因为每次浏览器刷新会生成不同的会话)
正如您应该从任何闪亮的训练中了解到的,接下来的步骤可能是将上述反应构造链接到其他UI元素,例如操作按钮或selectInput来过滤数据。
server <- function(input, output, session) {
---
output$foo <- reactivePlot(function() {
if((length(input$actionbutton) ==0) | (length(input$selectData) == 0)) return()
# the reactive now is connected to these two shiny inputs and executed every time they change
someQuery <- dbGetQuery(...) # some query of a database, maybe with a *where* clause dependent on input$selectData
plot(values$mydata)
}
---
}
现在,在按下操作按钮或进行新选择的每个时间执行查询。
我们假设,对于您的用例,我确定您已在ETL
中看到或实施过,您的数据经常会发生变化。假设文件(或表)由外部进程持续更新。
请注意,这个用例通常仍然被认为是静止的,即使经常更新(您正在批量处理数据,或者间隔非常小,小批量)。
这是您的第一个示例,其中reactiveFileReader
和reactivePoll
的不同结构发挥作用。
如果您有一个文件,例如日志文件,由外部流程经常更新,您可以使用reactiveFileReader
。
如果你有数据库表,你可以使用reactivePoll
每隔x秒轮询一次。
在这里,您的代码可以享受反应的全部好处:自动代码将每隔x秒执行一次,并且依赖于它的所有其他响应代码也将被刷新。
现在,让我们假设您尝试减少*批量大小&#34; (即窗口)对数据进行闪亮检查。你能走多远?
如果我记得前一段时间与Joe Cheng正确地进行了讨论,他相信闪亮的每秒可以处理50,000 events
(想象一下,可以轮询你的数据库或读取你的文件多少次每秒)。
假设我正确地记住了这一点,我会考虑50,000 events
一个理论上的限制(你必须减去在RBMS中查询数据所花费的时间,可能是通过局域网等),所以对于文件访问我会使用的东西&gt; 1毫秒(即每秒<1,000个文件读取),以及RDBMS的更大时间间隔。
因此,上述功能的时间单位是毫秒,真的不足为奇。
我认为通过上述结构,可以使用R + shiny
非常雄心勃勃的微批管道来实现。
甚至可以想象使用Apache Kafka
将数据发布到R + shiny
(可能使用负载均衡的Shiny Server Pro
多个实例为Kafka提供服务:yummy!)`
那么,运动中的数据呢?
好吧,如果您以R and shiny
可管理的速率从消防站获取数据,那么您就可以了(您可能很难确定哪个R算法用于此流媒体用例,但是这应该是另一个问题。)
另一方面,如果您的流程需要非常低的延迟,远远超出上面指定的范围,可能您需要考虑其他类型的工具和管道(例如使用Apache Flink
或考虑ad hoc
码)。
为非常罗嗦的解释道歉。如果它使这个复杂的话题更清楚,请告诉我。