r - 光沢のあるアプリで作られたプロットを保存



ggplot2 shiny (3)

ここでは、光沢のあるプロットを保存するためにggsaveを使用できるソリューションがあります。 論理チェックボックスとテキスト入力を使用してggsave()を呼び出します。 ui.R内のui.Rファイルにこれを追加します:

textInput('filename', "Filename"),
checkboxInput('savePlot', "Check to save")

次に、これを現在のoutput$plot代わりにserver.Rファイルに追加しますserver.R関数:

output$plot <- reactivePlot(function() {
    name <- paste0(input$filename, ".png")
    if(input$savePlot) {
      ggsave(name, plotInput(), type="cairo-png")
    }
    else print(plotInput())
  })

ユーザーは、テキストボックスに(拡張子なしで)目的のファイル名を入力し、チェックボックスをチェックしてappディレクトリに保存することができます。 チェックを外すとプロットが再印刷されます。 私はこれをやるためのより良い方法があると確信していますが、少なくとも私はggsaveとカイロをもっと良いpngグラフィックスのためにウィンドウで使うことができます。

ご提案があれば追加してください。

https://src-bin.com

私は、光沢のあるプロットを保存するためにdownloadButtonを使用する方法を理解しようとしています。 このパッケージの例では、.csvを保存するdownloadButton / downloadHandlerを示しています。 私はそれに基づいて再現可能な例を作るつもりです。

ui.R

shinyUI(pageWithSidebar(
  headerPanel('Downloading Data'),
  sidebarPanel(
selectInput("dataset", "Choose a dataset:", 
            choices = c("rock", "pressure", "cars")),
    downloadButton('downloadData', 'Download Data'),
    downloadButton('downloadPlot', 'Download Plot')
  ),
  mainPanel(
    plotOutput('plot')
  )
))

server.R

library(ggplot2)
shinyServer(function(input, output) {
  datasetInput <- reactive({
    switch(input$dataset,
           "rock" = rock,
           "pressure" = pressure,
           "cars" = cars)
  })

  plotInput <- reactive({
    df <- datasetInput()
    p <-ggplot(df, aes_string(x=names(df)[1], y=names(df)[2])) +
      geom_point()
  })

  output$plot <- renderPlot({
    print(plotInput())
  })

  output$downloadData <- downloadHandler(
    filename = function() { paste(input$dataset, '.csv', sep='') },
    content = function(file) {
      write.csv(datatasetInput(), file)
    }
  )
  output$downloadPlot <- downloadHandler(
    filename = function() { paste(input$dataset, '.png', sep='') },
    content = function(file) {
      ggsave(file,plotInput())
    }
  )
})

この疑問に答えるなら、おそらくこれに精通しているでしょうが、これを実行するには上記を別々のスクリプト( ui.Rserver.R )を作業ディレクトリ内のフォルダ( foo )に保存してください。 app、 runApp("foo")ます。

ggsaveを使用すると、ggsaveがfilename機能を使用できないことを示すエラーメッセージが表示されます(私は思います)。 標準のグラフィックスデバイス(下記参照)を使用すると、 Download Plotはエラーなく動作しますが、グラフィックは書き込まれません。

プロットを書くために働くdownloadHandlerを得るためのヒントは高く評価されます。


Answer #1

この質問がまだ有効かどうかは分かりませんが、「光沢のあるアプリでプロットを保存」を検索するときに最初に来たのは、元の質問の行に沿ってggsaveをdownloadHandlerと連携させる方法を素早く追加したいのです。

代わりに、ggsaveの代わりに直接出力を使用する代わりの方法と、alexwhan自身が提案した代替戦略はどちらも素晴らしいです。これはdownloadHandlerでggsaveを絶対に使用したい人向けです。

alexwhanによって報告された問題は、ggsaveがファイル拡張子を正しいグラフィックデバイスに一致させようとしているために発生します。 ただし、テンポラリファイルには拡張子がないため、マッチングは失敗します。 これは、元のコード例(pngの場合)のように、 ggsave関数呼び出しでデバイスを具体的に設定することで解決できます。

output$downloadPlot <- downloadHandler(
    filename = function() { paste(input$dataset, '.png', sep='') },
    content = function(file) {
        device <- function(..., width, height) grDevices::png(..., width = width, height = height, res = 300, units = "in")
        ggsave(file, plot = plotInput(), device = device)
    }
)

この呼び出しは、 ggsave内部的に割り当てるpng device関数を基本的に取ります( ggsave関数コードを見ればjpgpdfなどの構文を見ることができます)。 恐らく、理想的には、 ggsaveパラメータとしてファイル拡張子を指定することができます(ファイル名とは異なる場合 - ここでは一時ファイルの場合と同じですが)。このオプションはggsave現在利用できません。

最小限の自己完結型作業の例:

library(shiny)
library(ggplot2)
runApp(list(
  ui = fluidPage(downloadButton('foo')),
  server = function(input, output) {
    plotInput = function() {
      qplot(speed, dist, data = cars)
    }
    output$foo = downloadHandler(
      filename = 'test.png',
      content = function(file) {
        device <- function(..., width, height) {
          grDevices::png(..., width = width, height = height,
                         res = 300, units = "in")
        }
        ggsave(file, plot = plotInput(), device = device)
      })
  }
))

sessionInfo()
# R version 3.1.1 (2014-07-10)
# Platform: x86_64-pc-linux-gnu (64-bit)
# 
# locale:
#  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
#  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
#  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
#  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
# [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
# 
# attached base packages:
# [1] stats     graphics  grDevices utils     datasets  methods   base     
# 
# other attached packages:
# [1] ggplot2_1.0.0 shiny_0.10.1 
# 
# loaded via a namespace (and not attached):
#  [1] bitops_1.0-6     caTools_1.17     colorspace_1.2-4 digest_0.6.4    
#  [5] formatR_1.0      grid_3.1.1       gtable_0.1.2     htmltools_0.2.6 
#  [9] httpuv_1.3.0     labeling_0.2     MASS_7.3-34      munsell_0.4.2   
# [13] plyr_1.8.1       proto_0.3-10     Rcpp_0.11.2      reshape2_1.4    
# [17] RJSONIO_1.3-0    scales_0.2.4     stringr_0.6.2    tools_3.1.1     
# [21] xtable_1.7-3    

更新

ggplot2バージョン2.0.0以降では、 ggsave関数はdeviceパラメータの文字入力をサポートしています。つまり、downloadHandlerによって作成された一時ファイルを、 ggsaveへの直接呼び出しで保存できるようになりました"pdf" (デバイス関数を渡すのではなく)。 これにより、上記の例は以下のように単純化されます

output$downloadPlot <- downloadHandler(
    filename = function() { paste(input$dataset, '.png', sep='') },
    content = function(file) {
        ggsave(file, plot = plotInput(), device = "png")
    }
)

Answer #2

私はggsaveで動作させることはできませんでしたが、 png()への標準呼び出しで大丈夫と思われます。

私はあなたのserver.Rファイルのoutput$downloadPlot変更しました:

 output$downloadPlot <- downloadHandler(
    filename = function() { paste(input$dataset, '.png', sep='') },
    content = function(file) {
      png(file)
      print(plotInput())
      dev.off()
    })

私は光沢の0.3バージョンでいくつかの問題があったことに注意してください、それは最新のGithubから動作します:

library(devtools)
install_github("shiny","rstudio")




shiny