Как вызвать обновление данных в блестящем состоянии?

У меня есть блестящее приложение, которое запрашивает данные из SQL в кадры данных, а затем эти кадры данных ссылаются на мой блок shinyServer(). Я использовал его только в RStudio до сих пор, поэтому, когда мне нужны новые данные, я просто перезапускаю приложение и до того, как сервер загрузит его, он захватит все новые данные.

Я хотел бы перевести приложение на блестящий сервер, но я не уверен, как я могу заставить его периодически получать новые данные. Для интерфейса я бы хотел, чтобы он был автоматическим, а не пользователь, который нажал кнопку, чтобы начать загрузку. Есть ли идиоматическое решение для этого?

EDIT:

Я думаю, что нашел решение, которое работает для меня.

shinyServer(function(input,output,session){
    sourceData <- reactive({
        invalidateLater(1000000,session)

        functionThatGetsData()
    })
})

Ответ 1

Вы ищете invalidateLater. Поместите это, с соответствующим интервалом, в реактивное выражение, которое извлекает данные из базы данных.

Ответ 2

Наиболее разумным было бы использовать reactivePoll, если вы можете сделать быстрый запрос, чтобы обнаружить, есть ли новые данные. Только сегодня это сработало очень хорошо для меня.

reactivePoll shiny

Реактивный опрос



Описание

Используется для создания реактивного источника данных, который работает путем периодического опроса нереактивных данных.

Использование

reactivePoll(intervalMillis, session, checkFunc, valueFunc)

Аргументы

intervalMillis

Приблизительное количество миллисекунд ожидания между вызовами на checkFunc. Его может быть либо числовым значением, либо функцией, возвращающей числовое значение.

session

Сеанс пользователя, с которым нужно связать эту программу чтения файлов, или NULL, если его нет. Если значение не равно NULL, читатель автоматически остановится после окончания сеанса.

checkFunc Относительно дешевая функция, значения которой со временем будут проверены на равенство; неравенство указывает на то, что базовое значение изменилось и должно быть аннулировано и перечитано с использованием valueFunc. Подробнее...

valueFunc

Функция, которая вычисляет базовое значение. Смотрите подробности.

Ответ 3

Я не думаю, что любой из этих ответов полностью отвечает на вопрос OP. В частности,

всякий раз, когда мне нужны новые данные, я просто перезапустить приложение и до сервер загружает все новые данные.

что предполагает, что глобальный объект должен быть обновлен. Использование реактивов внутри серверной функции - не лучший ответ на эту проблему, потому что у вас есть состояние гонки, если несколько пользователей взаимодействуют с приложением одновременно... все они будут пытаться обновлять объект одновременно, что может разрешать или не разрешать само по себе. хорошо в зависимости от того, что обновление (это то, с чем я активно борюсь).

Одно из возможных решений, которое я исследовал, заключается в использовании пакета flock, чтобы каждый пользователь пытался получить блокировку глобального временного файла, и пользователю, успешно получившему его, было бы поручено выполнить глобальное обновление. Это напрямую касается состояния гонки. Я не проверил это достаточно полно, чтобы опубликовать это как решение, может быть, кто-то еще может работать с этим.