闪亮的服务器:更新服务器上的数据的最佳做法是什么

时间:2017-04-15 17:16:25

标签: shiny shiny-server

我有一个闪亮的应用程序正在从一些文件加载​​数据。 在服务器上,在不中断的情况下更新这些文件的最佳方法是什么 服务器?

在网上搜索,我找到了这两个解决方案:

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}}

重新加载以闪亮方式加载的文件的最佳做法是什么?

感谢您的任何意见!

1 个答案:

答案 0 :(得分:2)

让我尝试重新定位您的问题,定位您所指的一些纸张/示例代码。

在非常高的水平(即不必过多担心反应性),R + shiny与作为ETL过程的一部分处理数据的标准方法不同(例如)。

即。您可以在闪亮服务器中加载以下类型的外部数据之一:

  1. 加载静止数据,即驻留在文件中的数据 文件系统,或执行RDBMS查询。这是标准案例 这涵盖了大部分用法。
  2. 加载动态数据。这通常指的是数据流 您试图分析的某种类型(即没有坚持 它放入文件或RDBMS表中。)
  3. 让我们首先谈谈第一个案例的不同变种,静止的数据

    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中看到或实施过,您的数据经常会发生变化。假设文件(或表)由外部进程持续更新。

    请注意,这个用例通常仍然被认为是静止的,即使经常更新(您正在批量处理数据,或者间隔非常小,小批量)。

    这是您的第一个示例,其中reactiveFileReaderreactivePoll的不同结构发挥作用。

    如果您有一个文件,例如日志文件,由外部流程经常更新,您可以使用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码)。

    为非常罗嗦的解释道歉。如果它使这个复杂的话题更清楚,请告诉我。