首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >reactiveFileReader在为.RData增光

reactiveFileReader在为.RData增光
EN

Stack Overflow用户
提问于 2018-08-29 10:39:53
回答 3查看 891关注 0票数 1

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-27 09:15:49

此示例使用reactiveVal对象和observeinvalidateLater。数据被加载到一个新的环境中,并每2秒分配给reactiveVal。

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2018-11-26 19:53:57

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

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

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

与使用reactiveFileReader()函数连续创建reactiveFileReader文件和轮询数据不同,可以使用reactivePoll直接查询DB中的更改,(参见使用sqlite的示例this )。如果您的查询运行时间很长(我猜这是工作流的原因),您可以在将来包装它们,然后异步运行它们,(请参阅此post以获得一些灵感)。或者,许多DBMS提供类似于物化视图的功能,以避免过长的等待时间(根据假定的用户权限)。

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

票数 1
EN

Stack Overflow用户

发布于 2018-11-26 19:29:16

您可以在server.R的顶部使用load("data/workingdata.Rdata"),然后,每当任何人启动新的闪亮会话时,数据都将是最新的。可能的不利因素是:

  • 如果同时写入数据,则可能会出现问题,同时,一个新的闪亮会话正在加载数据。
  • 如果在新数据可用之前和之后打开会话,则数据将失效。

我想第一个可能的问题不会产生到足以成为一个问题。第二个可能的问题更有可能发生,但除非你处于超级危急的情况下,否则我看不出这是一个足以让人担心的实质性问题。

这对你有用吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52075432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档