2016-06-27 16 views
1

私はいくつかのRDataファイルを読み込んでその内容のテーブルを表示する光沢のあるアプリを開発中です。これらのファイルは、最終的にデータをデータフレームに変換するスクリプトによって生成されます。 save()関数を使用して保存されます。私は、彼らは時にファイルの更新されているので、ファイルが間隔で読むことにしたいRDataファイルをShiny Applicationに読み込む

ui.R、server.R、およびglobal.R

:私は3つのファイルを持っている光沢のあるアプリケーション内

したがって、私が使用しています、更新されています

reactiveFileReader() 

は私がオンライン発見した命令の数を踏襲しているが、私はエラー得続ける「エラー:TRUE/FALSEが必要とされている欠損値を」。

reactiveFileReader() 

機能性と単純server.R(もglobal.Rファイルで試してみました)でファイルをロードする:私は、私が使用していないこれを簡素化することを試みました。再び、

load() 

ステートメントはデータフレームで読み込み中です。私は、このファイルをロードして、変数にファイルを割り当て、 "as.data.table"を実行することで、これを作業していましたが、これは問題ではありません。これはデータフレーム形式で読み込む必要があります。私はこれがスコープ上の問題だと思いますが、わかりません。どんな助け?

http://pastebin.com/V01Uw0se

本当にありがとうございました:私のコードはです!

+0

'load'を使用して' Rdata'ファイルを読み込むと、元のデータフレーム名(保存時と同じ)がワークスペースに読み込まれます。 –

+0

私はそれがワークスペースに読み込まれることを知っています。私はglobal.Rを使ってしまった。なぜなら、もともと私は変数を見ることができなかったからだ。 – azdatasci

+0

と呼ぶときに、単にロードすると、私の最後の入力が途絶えてしまった:「変数< - 」を使って名前に明示的に割り当てなければならない。ワークスペースまた、データフレームをas.data.tableに変換しない限り、「エラー:必要な値がTRUE/FALSEの値がありません」というエラーがスローされます。 renderDataTable/dataTableOutputはテーブルのオブジェクト型のみを読み込みますか?再起動せずに定期的にファイルからこれを更新する方法の例はありますか?私はreactiveFileReaderとreactPollを見てきましたが、これをどのようにまとめていくかはわかりません。 – azdatasci

答えて

5

ここには、この投稿に影響を受けた解決策があります。http://www.r-bloggers.com/safe-loading-of-rdata-files/ Rdataファイルは、予期しない副作用(既存の変数の上書きなど)がないことを保証する新しい環境にロードされます。ボタンをクリックすると、新しいランダムデータフレームが生成され、ファイルに保存されます。それから、reactiveFileReaderはファイルを新しい環境に読み込みます。最後に、新しい環境の最初の項目にアクセスし(Rdataファイルにはデータフレームである変数が1つしかないと仮定して)、テーブルに出力します。

library(shiny) 

# This function, borrowed from http://www.r-bloggers.com/safe-loading-of-rdata-files/, load the Rdata into a new environment to avoid side effects 
LoadToEnvironment <- function(RData, env=new.env()) { 
    load(RData, env) 
    return(env) 
} 

ui <- shinyUI(fluidPage(

    titlePanel("Example"), 

    sidebarLayout(
    sidebarPanel(
     actionButton("generate", "Click to generate an Rdata file") 
    ), 

    mainPanel(
     tableOutput("table") 
    ) 
) 
)) 

server <- shinyServer(function(input, output, session) { 

    # Click the button to generate a new random data frame and write to file 
    observeEvent(input$generate, { 
    sample_dataframe <- data.frame(a=runif(10), b=rnorm(10)) 
    save(sample_dataframe, file="test.Rdata") 
    rm(sample_dataframe) 
    }) 

    output$table <- renderTable({ 
    # Use a reactiveFileReader to read the file on change, and load the content into a new environment 
    env <- reactiveFileReader(1000, session, "test.Rdata", LoadToEnvironment) 
    # Access the first item in the new environment, assuming that the Rdata contains only 1 item which is a data frame 
    env()[[names(env())[1]]] 
    }) 

}) 

shinyApp(ui = ui, server = server) 
+0

興味深い - 私はついに、いくつかの例の断片に基づいて思いついたことに似ています.RealFileReaderは私が必要とするものを見ませんでした。関数を使ってテーブルを割り当てた後、 "observe"ステートメントですべてをラップし、5秒ごとに更新するように指示しました。コードと私はこれが私であるかどうか私に言うことができますどのような方法でもnelegant .... – azdatasci

1

オクラホマ - 私は必要なことをする方法を考え出しました。私の最初の問題では、 'renderDataTable'のルックアンドフィールが欲しかったですが、データフレームを取得したい(renderDataTable/dataTableOutputはこれを許可しません。テーブル形式でなければなりません)。これを行うために、私はReportingTools(Bioconductor製)の便利な使い方とその使い方を見つけました。これは、あなたが直接データフレームを使用して、まだなどのソート、検索、ページネーション、とHTMLのテーブルを持つことができます...詳細はここで見つけることができます:

https://bioconductor.org/packages/release/bioc/html/ReportingTools.html

さて、私の第二の問題のために - 更新をデータとテーブルを定期的に再起動する必要はありません。これはシンプルであることが判明しました。シャイニーを初めて知りました。この例を単純にするために、上記のソリューションではなくrenderToolsパッケージを使用して、renderTableを使用しました。この例を単純にしておきたいだけでした。私が最初にしたのは、observer({})内のserver.Rコード(shinyServer()関数内)をすべてラップすることでした。次に、invalidateLater()を使用して、5秒ごとにリフレッシュするように指示しました。ここでは、コードは次のとおりです。

## server.R ## 
library(shiny) 
library(shinydashboard) 
library(DT) 

shinyServer(function(input, output, session) { 

    observe({ 

    invalidateLater(5000,session) 

    output$PRI1LastPeriodTable <- renderTable({ 
     prioirtyOneIncidentsLastPeriod <- updateILP() 
    }) 
    }) 
}) 

さて、renderTable()部分の元、私はちょうどロードされたのオブジェクトの名前を呼んでいました。Rdataファイルですが、毎回読みたいので、global.Rファイル(これはserver.Rにあった可能性があります)に関数を作成してファイルをロードしました。そのコードはここにあります:

updateILP <- function() { 
    load(file = "W:/Projects/R/Scripts/ITPOD/itpod/data/prioirtyOneIncidentsLastPeriod.RData", envir = .GlobalEnv) 
    return(prioirtyOneIncidentsLastPeriod) 
} 

これは、それ以外はglobal.Rファイルにはありません。しかし、あなたのui.Rは、セットアップ、呼び出しtableOutout、dataTableOutput、またはあなたのレンダリング方法がUI内にあるものです。したがって、5秒ごとにrenderTable()コードが5秒ごとに読み込まれ、実際にファイルを読み取る関数が呼び出されます。私はこれをデータファイルに変更することでテストしました。魅力のように動作します。

これが美しくない、または効率的でない場合は、改善できるかどうか教えてください。これは私がこれを理解できる最も単純な方法でした。ヘルプとコメントの皆様に感謝します!

+0

根底にあるメカニズムは私のソリューションと同じです( 'reactiveFileReader'は' invalidateLater'を使う 'reactivePoll'を使います)。問題を解決するためのおめでとう。 –

+0

'reactiveFileReader'を使うことは、変更があったときにファイルを読み込むだけなので、まだ利点があります。これにより、ディスクのアクティビティやサーバーの負荷が軽減されます。 –

+0

@warmoverflowええ、多分、私はreactiveFileReaderを再訪すべきです。私はそれがやろうとしていたものだと思った。私はグローバルでそれを持っていました.R: "dataUpdate < - reactiveFileReader(...)"レンダリング({})関数の下の私のserver.Rコードでは、 "data < - updateData"を持っていましたが、その出力ではなく "data"変数に関数を代入しようとしていたようなエラーがありましたロードコマンド。たぶん私は間違って使用した...私は戻ってチェックアウトする必要があります... – azdatasci

関連する問題