更改基础CSV

时间:2018-10-18 15:06:55

标签: r csv shiny reactive-programming

我正在开发一个复杂的(对我来说)Shiny应用程序,大约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时更新数据框,但计划的更新也可以。

在此先感谢您提供的所有帮助,对于无法提供可复制的示例,我深表歉意!我将尝试根据需要添加更多信息。

1 个答案:

答案 0 :(得分:0)

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

例如,在上面的代码中,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)是您想要的因子列的反应性唯一值填充输入。