【问题标题】:Using reactiveFileReader in Shiny app to update a dataframe upon change to underlying CSV在 Shiny 应用程序中使用 reactiveFileReader 在更改为基础 CSV 时更新数据框
【发布时间】:2019-03-23 10:40:59
【问题描述】:

我正在开发一个复杂的(对我而言)闪亮的应用程序,大约 2500 行代码。基本结构如下,虽然我不一定能分享一个可重现的例子,因为大部分信息都是机密的。

现在,我正在使用 df1 <- read.csv() 等来读取几个 CSV 文件作为数据框。我想使用reactiveFileReader() 使其在源 CSV 文件被修改时自动更新数据框。我认为我的问题可能与我没有在反应性上下文中执行此操作有关,但这是有原因的。我正在使用数据框df1 等来执行许多计算并在整个应用程序(UI 和服务器部分)中创建新变量。

还可能需要注意的是,我在 Shiny 应用程序的 UI 部分中执行这些文件导入,因为我需要依赖这些数据帧的因子级别来填充我的 UI 中的下拉 selectInput。这可能没有必要。

这是我尝试过的(虽然我很迷茫):

reader <- reactiveFileReader(intervalMillis = 1000, filePath = 
"Data_Record.csv", readFunc = read.csv)

  data_record <- reactive({
    data_df <- reader()
    return(data_df)
  })

我期望data_record 是一个包含来自 CSV 的信息的数据框,但它最终成为一个“反应式表达式”。当我尝试对data_record 执行操作时,例如子集,我收到错误,因为该变量不是数据框。

我有什么方法可以在对反应式上下文之外的基础 CSV 进行修改时更新这些数据帧?即使是每 10 秒左右的预定更新也可以正常工作。 我的最终目标是在修改 CSV 时更新数据帧,但计划更新也可以。

提前感谢所有帮助,对于无法提供可重现的示例,我深表歉意!我会根据需要尝试添加更多信息。

【问题讨论】:

    标签: r csv shiny reactive-programming


    【解决方案1】:

    因此,如果您希望数据具有反应性,则必须将其作为“反应性”导入应用程序的服务器部分。在闪亮的情况下,“反应式”变成了函数,因此要对它们做任何事情,您必须引用它们的名称,然后在反应式函数中加上括号(反应式、观察式、渲染等)。

    例如,在上面的代码中,reader 变成了一个反应式数据框。如果您遵循上述反应式规则,您可以对 reader 执行正常的数据操作。

    # server.R
    
    reader <- reactiveFileReader(intervalMillis = 1000, filePath = 
    "Data_Record.csv", readFunc = read.csv)
    
    filtered_reader_df <- reactive({
      reader() %>% filter(x > 100)
    })
    

    filtered_reader_df 成为响应式 csv 文件的响应式过滤版本。同样,要在后续反应函数中使用filtered_reader_df,它必须引用为filtered_reader_df(),因为它本身就是一个反应函数。

    最后,您仍然可以使用响应式 csv 文件在服务器的观察者中使用 updateSelectInput() 函数填充 UI 元素。例如:

    ui <- fluidPage(
      selectInput("mySelectInput", "Select")
    )
    
    server <- function(input, output, session) {
    
      reader <- reactiveFileReader(intervalMillis = 1000, filePath = 
                                     "Data_Record.csv", readFunc = read.csv)
    
      observe({
        select_input_choices <- unique(reader()$factor_column)
    
        updateSelectInput(session, inputId = "mySelectInput", choices = select_input_choices)
      })
    
    }
    

    每当reader() 数据框随reactiveFileReader 更改时,上面的代码将更新选择输入的选择,其中unique(reader()$factor_column) 是您要填充输入的因子列的反应唯一值。

    【讨论】:

    • 非常感谢保罗!我大部分理解您回答的前提,并将在今天下午尝试实施。我想我对如何使用响应式数据框仍有一些不确定性。例如,在我的应用程序中,我想向reader 添加大约 10 个新的计算列。我怎样才能在一个reactive 中方便地做到这一点?以前,我在做类似reader$col1 &lt;- some calculations 之类的事情,但我不确定如何将这一切包装到反应式中。或者,如果我想基于反应性 reader 创建一个新的数据框,然后将在其他地方使用
    • 嗨@doublestufcoreo,我鼓励您观看从47.25 标记vimeo.com/131218530 开始的闪亮教学视频的反应部分。我上面的第一个示例向您展示了如何从反应式阅读器创建反应式数据集。要创建新列,我会在反应函数中使用dplyr::mutate,例如:reader_wNewCols &lt;- reactive({ reader() %&gt;% mutate(newCol1 = colX + colY) })
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多