watcher

R-CMD-check Codecov test coverage

Watch the File System for Changes

R binding for ‘libfswatch’, a file system monitoring library. This uses the optimal event-driven API for each platform:

Watching is done asynchronously in the background, without blocking the session.

Installation

Install the current development version of watcher using:

pak::pak("r-lib/watcher")

Installation from Source

watcher requires the ‘libfswatch’ library.

Quick Start

Create a ‘Watcher’ using watcher::watcher().

By default this will watch the current working directory recursively and write events to stdout.

Set the callback argument to run an R function, or rlang-style formula, every time a file changes:

library(watcher)
dir <- file.path(tempdir(), "watcher-example")
dir.create(dir)

w <- watcher(dir, callback = ~print(.x), latency = 0.5)
w
#> <Watcher>
#>   Public:
#>     initialize: function (path, callback, latency) 
#>     path: /tmp/Rtmp9R4IEk/watcher-example
#>     running: FALSE
#>     start: function () 
#>     stop: function () 
#>   Private:
#>     watch: externalptr
w$start()

file.create(file.path(dir, "newfile"))
#> [1] TRUE
file.create(file.path(dir, "anotherfile"))
#> [1] TRUE
later::run_now(1)
#> [1] "/tmp/Rtmp9R4IEk/watcher-example/newfile"
#> [1] "/tmp/Rtmp9R4IEk/watcher-example/anotherfile"

newfile <- file(file.path(dir, "newfile"), open = "r+")
cat("hello", file = newfile)
close(newfile)
later::run_now(1)
#> [1] "/tmp/Rtmp9R4IEk/watcher-example/newfile"

file.remove(file.path(dir, "newfile"))
#> [1] TRUE
later::run_now(1)
#> [1] "/tmp/Rtmp9R4IEk/watcher-example/newfile"

w$stop()
unlink(dir, recursive = TRUE, force = TRUE)

Acknowledgements

Thanks to the authors of ‘libfswatch’, upon which this package is based: