代码之家  ›  专栏  ›  技术社区  ›  Dhiraj

.RData中的reactiveFileReader

  •  1
  • Dhiraj  · 技术社区  · 7 年前

    我目前在一个闪亮的应用程序中的工作流程是定期将R脚本作为cron作业运行,从多个数据库中提取各种表,并从一些api下载数据。然后将这些文件保存为.Rdata文件,保存在名为 data .

    在我的 global.R 我使用 load("data/workingdata.Rdata") . 这将导致将所有数据帧(约30个)加载到环境中。我知道我可以用 reactiveFileReader() load 被接受为 readFunc 在里面 reactiveFileReader()

    3 回复  |  直到 7 年前
        1
  •  1
  •   SeGa    7 年前

    本例使用 reactiveVal 对象 observe invalidateLater . 数据被加载到一个新的环境中,并每2秒分配给reactiveVal。

    library(shiny)
    
    ui <- fluidPage(
      actionButton("generate", "Click to generate an Rdata file"),
      tableOutput("table")
    )
    
    server <- shinyServer(function(input, output, session) {
    
      ## Use reactiveVal with observe/invalidateLater to load Rdata
      data <- reactiveVal(value = NULL)
      observe({
        invalidateLater(2000, session)
        n <- new.env()
        print("load data")
        env <- load("workingdata.Rdata", envir = n)
        data(n[[names(n)]])
      })
    
    
      ## Click the button to generate a new random data frame and write to file
      observeEvent(input$generate, {
        sample_dataframe <- iris[sample(1:nrow(iris), 10, F),]
        save(sample_dataframe, file="workingdata.Rdata")
        rm(sample_dataframe)
      })
    
      ## Table output
      output$table <- renderTable({
        req(data())
        data()
      })
    })
    
    
    shinyApp(ui = ui, server = server)
    
        2
  •  1
  •   ismirsehregal    7 年前

    关于您的工作流程的一些想法:

    处理文件时,总是会有一些管理开销(例如,读取.RData文件时是否已完成?)。在我看来,这(部分地)是DBMS用来处理家务的。它们中的大多数都有复杂的解决方案,以确保您快速获得所查询的内容;那么为什么要重新发明轮子呢?

    而不是不断地创建.RData文件并使用您需要的reactiveFileReader()函数轮询数据 使用reactivePoll(请参阅 this 例如使用sqlite)。如果您的查询是长时间运行的(我猜这是您的工作流程的原因),您可以在将来包装它们并 (见下图) post 获得一些灵感)。 或者,许多DBMS提供类似物化视图的功能,以避免长时间的等待(根据假定的用户权限)。

    当然,所有这些都是基于假设的,因为事实上,我并不知道你的生态系统,但根据我的经验,减少接口意味着减少错误的来源。

        3
  •  0
  •   dca    7 年前

    load("data/workingdata.Rdata") 在server.R的顶部,任何人只要开始一个新的闪亮会话,数据都是最新的。可能的缺点是:

    • 如果在写入数据的同时新的会话正在加载数据,则可能会出现故障。

    我想第一个可能出现的问题不足以成为问题。第二个可能的问题更可能发生,但除非你处于一个超临界的情况下,我看不出这是一个实质性的问题足够担心。

    推荐文章