Ответ 1
Вы ищете invalidateLater
. Поместите это, с соответствующим интервалом, в реактивное выражение, которое извлекает данные из базы данных.
У меня есть блестящее приложение, которое запрашивает данные из SQL в кадры данных, а затем эти кадры данных ссылаются на мой блок shinyServer(). Я использовал его только в RStudio до сих пор, поэтому, когда мне нужны новые данные, я просто перезапускаю приложение и до того, как сервер загрузит его, он захватит все новые данные.
Я хотел бы перевести приложение на блестящий сервер, но я не уверен, как я могу заставить его периодически получать новые данные. Для интерфейса я бы хотел, чтобы он был автоматическим, а не пользователь, который нажал кнопку, чтобы начать загрузку. Есть ли идиоматическое решение для этого?
EDIT:
Я думаю, что нашел решение, которое работает для меня.
shinyServer(function(input,output,session){
sourceData <- reactive({
invalidateLater(1000000,session)
functionThatGetsData()
})
})
Вы ищете invalidateLater
. Поместите это, с соответствующим интервалом, в реактивное выражение, которое извлекает данные из базы данных.
Наиболее разумным было бы использовать reactivePoll
, если вы можете сделать быстрый запрос, чтобы обнаружить, есть ли новые данные. Только сегодня это сработало очень хорошо для меня.
reactivePoll shiny
Реактивный опрос
Описание
Используется для создания реактивного источника данных, который работает путем периодического опроса нереактивных данных.
Использование
reactivePoll(intervalMillis, session, checkFunc, valueFunc)
Аргументы
intervalMillis
Приблизительное количество миллисекунд ожидания между вызовами на
checkFunc
. Его может быть либо числовым значением, либо функцией, возвращающей числовое значение.session
Сеанс пользователя, с которым нужно связать эту программу чтения файлов, или
NULL
, если его нет. Если значение не равно NULL, читатель автоматически остановится после окончания сеанса.checkFunc
Относительно дешевая функция, значения которой со временем будут проверены на равенство; неравенство указывает на то, что базовое значение изменилось и должно быть аннулировано и перечитано с использованиемvalueFunc
. Подробнее...valueFunc
Функция, которая вычисляет базовое значение. Смотрите подробности.
Я не думаю, что любой из этих ответов полностью отвечает на вопрос OP. В частности,
всякий раз, когда мне нужны новые данные, я просто перезапустить приложение и до сервер загружает все новые данные.
что предполагает, что глобальный объект должен быть обновлен. Использование реактивов внутри серверной функции - не лучший ответ на эту проблему, потому что у вас есть состояние гонки, если несколько пользователей взаимодействуют с приложением одновременно... все они будут пытаться обновлять объект одновременно, что может разрешать или не разрешать само по себе. хорошо в зависимости от того, что обновление (это то, с чем я активно борюсь).
Одно из возможных решений, которое я исследовал, заключается в использовании пакета flock, чтобы каждый пользователь пытался получить блокировку глобального временного файла, и пользователю, успешно получившему его, было бы поручено выполнить глобальное обновление. Это напрямую касается состояния гонки. Я не проверил это достаточно полно, чтобы опубликовать это как решение, может быть, кто-то еще может работать с этим.