我正在尝试以闪亮的方式设置以下内容:
如何实现这一点?
根据各种帖子,我一直在尝试运气
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)
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
:与观察类似,但是 仅当特定事件发生时触发。