使用reactivePoll监控并处理文件变化

问题描述 投票:0回答:1

我正在尝试以闪亮的方式设置以下内容:

  1. 使用自定义读取例程读取源文件
  2. 处理数据帧并渲染
  3. 使用自定义文件更改检查器监视源文件的更改:当源文件更改时,重复 1 和 2

如何实现这一点?

根据各种帖子,我一直在尝试运气

reactivePoll
,因为这在概念上似乎是最简单的。但是,根据具体的尝试,我遇到了各种问题,例如找不到
checkFunc
,或其输入参数未被识别。

更一般地说,我仍在努力理解使变量成为反应性的多种方式(反应性与观察与观察事件的优点)以及所有这些如何适用于我的情况。

下面是一些希望提供要点的简化代码:

library(shiny)
library(tidyverse)

#---------create data-----------
#tibble
id=c('p1','p2','p3')
val=c(2,4,6)
my_data=tibble(id,val)

#csv
file_csv='test.csv'
write_csv(my_data,file_csv)


#my "checkFunc" routine (with input argument)
myFileCheck = function(input_path) {
  if (file.exists(input_path))
    file.info(input_path)$mtime[1]
  else
    ""}
#test
tmp_time = myFileCheck(file_csv)
print(tmp_time)


#my read routine (with input argument)
myReadRoutine = function(input_path){
  df = read_csv(input_path, id = 'my_source')
}
#test
tmp_df=myReadRoutine(file_csv)
print(tmp_df)

#----------shiny---------
#ui
ui = fluidPage(tableOutput('my_data'))

#server
server = function(input, output, session) {
  
  #-----this part works---
  #always read data upon launch
  df_shiny=myReadRoutine(file_csv)
  
  #some processing for display
  df_shiny_display = reactive({df_shiny %>%
      mutate(val2=val*10)})
  
  #render
  output$my_data = renderTable(df_shiny_display())
  
  #-----this part doesn't----
  #use custom file check function (with argument): if file has changed, use custom file reader
  df_shiny = reactivePoll(1000, session, checkFunc = myFileCheck(file_csv), myReadRoutine(file_csv))
}

shinyApp(ui = ui,
         server = server)
r shiny
1个回答
0
投票
ReactPoll 中的

checkFunc
valueFunc
必须是 functions,而不是 调用它们的结果。您当前正在调用 myFileCheck(file_csv) 和 myReadRoutine(file_csv) 而不是传递函数对象。

此外

checkFunc

应该返回一个随文件更改而更改的值,例如文件的修改时间。

更正代码:

library(shiny) library(tidyverse) #---------create data----------- # Create a tibble id <- c('p1', 'p2', 'p3') val <- c(2, 4, 6) my_data <- tibble(id, val) # Write to a CSV file file_csv <- 'test.csv' write_csv(my_data, file_csv) # Custom file check function myFileCheck <- function(input_path) { if (file.exists(input_path)) file.info(input_path)$mtime[1] else Sys.time() # Return current time if the file does not exist } # Custom read routine myReadRoutine <- function(input_path) { read_csv(input_path, show_col_types = FALSE) } #--------- Shiny App --------- # UI ui <- fluidPage( tableOutput('my_data') ) # Server server <- function(input, output, session) { # Monitor the file for changes using reactivePoll df_shiny <- reactivePoll( intervalMillis = 1000, # Check every second session = session, checkFunc = function() myFileCheck(file_csv), # Check if the file has changed valueFunc = function() myReadRoutine(file_csv) # Read the file ) # Process the data for display df_shiny_display <- reactive({ df_shiny() %>% mutate(val2 = val * 10) }) # Render the table output$my_data <- renderTable({ df_shiny_display() }) } # Run the application shinyApp(ui = ui, server = server)

了解反应性

  • Reactive
    :创建依赖关系并在任何时候重新计算
    依赖关系发生变化。用于需要使用的值
    下游计算或渲染。
  • observe
    :执行其代码
    依赖性改变时的副作用。用于打印、单击按钮、写入文件等操作
  • observeEvent
    :与观察类似,但是
    仅当特定事件发生时触发。
© www.soinside.com 2019 - 2024. All rights reserved.