2

私はこれこのスレッドと他のいくつかを見てきましたが、私の解決策を理解することができませんでした.

R と Shiny を使用してダッシュボードを作成しました。ダッシュボードはRPostgreSQLパッケージを使用して Postgres db からデータを取得します。現在、すべてのデータのプルと分析のコードはshinyServer関数の外部で行われ、表示部分 (outputおよびrender関数) のみがそのshinyServer部分にあります。ダッシュボードのデータが定期的に更新され、グラフが更新されるように設定したいと思います。私はそれらを調べてreactivePoll理解invalidateLaterしましたが、コードに実装する方法がわかりません。

server.R簡単なコード例を次に示します。

library(RPostgreSQL)

drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host='host', port='12345', dbname='mydb',
                 user='me', password='mypass')

myQuery <- "select * from table"
myTable <- dbGetQuery(con, myQuery)

foo <- nrow(myTable)
bar <- foo * 2

shinyServer(
  function(input, output, session) {
    output$foo <- renderText(foo)
    output$bar <- renderText(bar)

    session$onSessionEnded(function(){
      dbDisconnect(con)
      dbDisconnect(con2)
      dbUnloadDriver(drv)
    })
  }
)

foo定期的に更新したい場合は、dbGetQueryコマンドも更新する必要があり、それらをすべて連携させる方法がわかりません。再フォーマットしてすべてをshinyServer関数内に配置する必要がありますか? 私は約 250 行のコードを持っていますが、それらすべてをそこに入れるのは間違っているように感じます。そこにデータ プル パーツを入れるだけで、順序が乱れる可能性があります。どんな助けでも大歓迎です。

4

1 に答える 1

3

新しいデータがある場合にのみデータ全体を再フェッチするため、reactivePoll代わりにを使用します。invalidateLater

shinyServerただし、その後の計算は (リアクティブな) データに依存するため、内にデータをフェッチするコードを配置する方法はありません。

免責事項:私はSQLの経験がまったくなく、適切なデータベースがないためにコードをテストできませんでしたがshiny、次のコードを理解すればうまくいくはずです。

library(RPostgreSQL)

drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host='host', port='12345', dbname='mydb',
                 user='me', password='mypass')

check_for_update <- function() {
  dbGetQuery(con, "SELECT MAX(timestamp) FROM table") # edit this part in case
  # the syntax is wrong. the goal is to create an identifier which changes
  # when the underlying data changes
}
get_data <- function() {
  dbGetQuery(con, "select * from table")
}
close_connection <- function() {
  dbDisconnect(con)
  dbUnloadDriver(drv)
}

shinyServer(
  function(input, output, session) {
    # checks for new data every 10 seconds
    data <- reactivePoll(10000, session,
                         checkFunc = check_for_update,
                         valueFunc = get_data)

    # the outputs will only be refreshed in case the data changed
    output$foo <- renderText({
      nrow(data())
    })
    output$bar <- renderText({
      bar <- data() * 2
    })

    session$onSessionEnded(close_connection)
  }
)

アプリの構造によってはreactive、複数の場所で再利用できる別の に計算をラップすると便利な場合があります。

このチュートリアルでは、shinyApps でのコード実行に関するいくつかの注意事項を見つけることができます。

問題が発生した場合は、コメントを残してください。それに応じて投稿を更新しようとします。

于 2015-10-09T23:07:23.020 に答える