web-dev-qa-db-ja.com

Shiny R-テーブルの結果をダウンロードする

私はShinyを初めて使用し、非常にシンプルな光沢のあるアプリを作成しました。

library(shiny)

ui <- fluidPage(
  fluidRow(column(7,dataTableOutput('dto')))
)

server <- function(input,output){

  output$dto <- renderDataTable({MYTABLE})


}

runApp(list(ui=ui,server=server))

テーブルの結果をダウンロードするオプションを置く方法はありますか(CSV、XLSXであるかどうかは関係ありません...)

乾杯

9
jmarco10

データ自体を反応式にする場合、downloadButton()またはdownloadLink()downloadHandlerと組み合わせて使用​​するのは非常に簡単です。次に、同じ反応式を使用して、出力に送信するものをダウンロードできます。

小さな例:

_library(shiny)

ui <- fluidPage(
  # This one is linked by the id 'download'
  downloadButton('download',"Download the data"),
  fluidRow(column(7,dataTableOutput('dto')))
)

server <- function(input,output){
  # Reactive expression with the data, in this case iris
  thedata <- reactive(iris)

  output$dto <- renderDataTable({thedata()})
  output$download <- downloadHandler(
    filename = function(){"thename.csv"}, 
    content = function(fname){
      write.csv(thedata(), fname)
    }
  )

}

runApp(list(ui=ui,server=server))
_

覚えておいてください:

  • contentの引数downloadHandlerは、ファイルを生成する関数でなければなりません!接続/ファイル名には1つの引数を取る必要があります。この例ではcsvファイルですが、たとえば画像の場合はpng()およびdev.off()を使用でき、ggplotsの場合はggsave()、...を使用できます。
  • 引数filenameは関数である必要はありませんが、その方がうまく機能することがわかりました。特に、ファイル名の反応式を扱う場合。
  • 出力リストを介してdownloadHandlerdownloadButtonをリンクします。downloadButtonのIDは、downloadHandlerによって返される出力要素の名前です。

編集:

このためにdownload.file()を使用しようとする人もいますが、それも誤りです。関数download.file()は、サーバー側ではなくユーザー側で使用すると機能します。これにより、インターネットから関数を呼び出しているコンピューターにファイルをダウンロードできます。これをShinyアプリケーションで使用する場合、ローカルで実行すると機能します。これは、ユーザーとサーバーが同じマシンであるためです。ただし、アプリをShinyサーバーにデプロイする場合、download.file()は基本的にサーバーからではなくサーバーにファイルをダウンロードします。

13
Joris Meys

datatable/DT拡張buttonsに直接基づく、少し代替のソリューション。

Jorisからサンプルデータを恥知らずに借りています...

library(shiny)
library(DT)

ui <- fluidPage(
 # This one is linked by the id 'download'
  fluidRow(column(7,dataTableOutput('dto')))
)

server <- function(input,output){
  # Reactive expression with the data, in this case iris
  thedata <- reactive(iris)

#the extensions parameter coupled with the options list does the trick  
output$dto <- renderDataTable(thedata(), extensions = 'Buttons', 
                options = list(dom = 'Bfrtip',
                buttons = c('copy', 'csv', 'Excel', 'pdf', 'print'))
  )
}

runApp(list(ui=ui,server=server), launch.browser=TRUE) #now runs by default in the external browser.

これはさまざまな出力で機能し、個人的には私はよりクリーンな外観が好きです。外部ブラウザでデモを実行していることを確認してください。それ以外の場合は機能しません。

8
Buggy

ファイル名が機能しないため、ブラウザでアプリを実行する必要があります。私が使う

runApp(list(ui=ui,server=server),launch.browser = T)

そしてそれは私にとって完璧に機能します。

launch.browser=TRUEを使用したくない場合は、光沢のあるアプリでダウンロードボタンを使用するときに、ファイル名の最後にファイル名と拡張子.csvなどを記述できます。

1
Fabian Pino