.RData中

时间:2018-08-29 10:39:53

标签: r shiny

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

在我的global.R文件中,我使用load("data/workingdata.Rdata")加载数据。这导致所有数据帧(约30个)加载到环境中。我知道我可以使用reactiveFileReader()函数来刷新数据,但是显然由于与该函数相关的会话,因此必须在server.R文件中使用它。另外,我不确定load中的readFunc是否被接受为reactiveFileReader()。在此情况下,最佳方案应该是什么?

3 个答案:

答案 0 :(得分:1)

对您的工作流程的几点思考:

最后,在使用RData方法时,您将与数据库/ API并行设置另一个数据源。

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

您可以直接使用ReactivePoll直接查询数据库中的更改,而不用使用reactFileReader()函数来连续创建.RData文件和轮询数据(请参见this 以使用sqlite为例)。如果您的查询长期运行(我猜这是造成您的工作流的原因),则可以在将来包装它们并异步运行(请参阅post  以获得一些灵感)。 另外,许多DBMS提供诸如物化视图之类的东西,以避免长时间的等待(根据假定的用户特权)。

当然,所有这些都是基于假设的,原因是我不了解您的生态系统,但以我的经验,减少接口意味着减少错误源。

答案 1 :(得分:1)

此示例将reactiveVal对象与observeinvalidateLater结合使用。数据会每2秒加载到一个新环境中并分配给reactVal。

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 :(得分:0)

您可以在服务器顶部使用load("data/workingdata.Rdata")。然后,无论何时任何人开始新的Shiny会话,数据都是最新的。可能的缺点是:

  • 如果在新的Shiny会话正在加载数据的同时写入数据,则可能会打 如果在新数据可用之前和之后打开会话,则
  • 数据将是陈旧的。

我想第一个可能出现的问题不会引起太大的问题。第二种可能的问题更有可能发生,但是除非您处于超紧急情况下,否则我认为这不是一个足以担心的实质性问题。

对您有用吗?