Used to create a reactive data source, which works by periodically polling a non-reactive data source.
reactivePoll(intervalMillis, session, checkFunc, valueFunc)
Approximate number of milliseconds to wait between
calls to checkFunc
. This can be either a numeric value, or a
function that returns a numeric value.
The user session to associate this file reader with, or
NULL
if none. If non-null, the reader will automatically stop when
the session ends.
A relatively cheap function whose values over time will be
tested for equality; inequality indicates that the underlying value has
changed and needs to be invalidated and re-read using valueFunc
. See
Details.
A function that calculates the underlying value. See Details.
A reactive expression that returns the result of valueFunc
,
and invalidates when checkFunc
changes.
reactivePoll
works by pairing a relatively cheap "check" function with
a more expensive value retrieval function. The check function will be
executed periodically and should always return a consistent value until the
data changes. When the check function returns a different value, then the
value retrieval function will be used to re-populate the data.
Note that the check function doesn't return TRUE
or FALSE
to
indicate whether the underlying data has changed. Rather, the check function
indicates change by returning a different value from the previous time it was
called.
For example, reactivePoll
is used to implement
reactiveFileReader
by pairing a check function that simply returns the
last modified timestamp of a file, and a value retrieval function that
actually reads the contents of the file.
As another example, one might read a relational database table reactively by
using a check function that does SELECT MAX(timestamp) FROM table
and
a value retrieval function that does SELECT * FROM table
.
The intervalMillis
, checkFunc
, and valueFunc
functions
will be executed in a reactive context; therefore, they may read reactive
values and reactive expressions.
function(input, output, session) {
data <- reactivePoll(1000, session,
# This function returns the time that log_file was last modified
checkFunc = function() {
if (file.exists(log_file))
file.info(log_file)$mtime[1]
else
""
},
# This function returns the content of log_file
valueFunc = function() {
read.csv(log_file)
}
)
output$dataTable <- renderTable({
data()
})
}
#> function (input, output, session)
#> {
#> data <- reactivePoll(1000, session, checkFunc = function() {
#> if (file.exists(log_file))
#> file.info(log_file)$mtime[1]
#> else ""
#> }, valueFunc = function() {
#> read.csv(log_file)
#> })
#> output$dataTable <- renderTable({
#> data()
#> })
#> }
#> <environment: 0x5584929b5a58>