[解決済み] Shinyアプリで作成したプロットを保存する方法
質問
shinyでプロットを保存するためにdownloadButtonを使用する方法を見つけようとしています。パッケージの例では
downloadButton/downloadHandler
を使って.csvを保存しています。私はそれに基づいて再現可能な例を作るつもりです。
については
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.R
と
server.R
をフォルダ (
foo
)にコピーします。shinyアプリを実行するには
runApp("foo")
.
使用方法
ggsave
を使用すると、以下のようなエラーメッセージが表示されます。
ggsave
を使用することはできません。
filename
関数を使用することができます(と思います)。標準のグラフィックデバイス(下のような)を使用すると
Download Plot
はエラーなしで動作しますが、グラフィックは書き込まれません。
プロットを書くためにdownloadHandlerを動作させるための任意のヒントは、感謝されます。
どのように解決するのですか?
この質問がまだ有効かどうかは分かりませんが、"saving plots in shiny app"を検索したときに最初に出てきたものなので、元の質問の線に沿って、ggsaveをdownloadHandlerで動作させる方法をすぐに追加したいと思いました。
ggsaveの代わりに直接出力を使用するjubaによって提案された代替戦略、およびalexwhan自身によって提案された代替戦略は、両方とも素晴らしい動作をします。)
alexwhan によって報告された問題は、ggsave がファイル拡張子を正しいグラフィック デバイスに一致させようとすることが原因です。しかし、一時ファイルには拡張子がないため、マッチングに失敗します。この問題は
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)
}
)
この呼び出しは基本的に
device
関数で
png
その
ggsave
は内部で割り当てを行います。
ggsave
関数の構文を見てください。
jpg
,
pdf
など)。おそらく、理想的には、ファイル拡張子 (ファイル名と異なる場合 - ここでは一時ファイルの場合) を
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")
}
)
関連
-
DEG解析で'row.names'に重複した名前を付けられない場合の解決法
-
[解決済み] Rでデータフレームに行を追加する方法は?
-
[解決済み] Rの%*%の意味 [重複]について
-
[解決済み] HTML、PDF、DOCXで見栄えのするシンプルな手動のRMarkdownテーブル
-
[解決済み] 特定のサイズのプロットウィンドウを作成する
-
[解決済み] データフレーム列の名前によるドロップ
-
[解決済み] リストをデータフレームに変換する
-
[解決済み] ggplot2 Rプロットで軸の制限を設定するには?
-
[解決済み】自作関数を書くときにRの省略機能を使うには?
-
[解決済み] ggplot2 で個々のファセットにテキストをアノテートする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
R言語です。「接続を開くことができません」解決策
-
R - ユークリッド距離の計算を簡単にする方法
-
[解決済み] HTML、PDF、DOCXで見栄えのするシンプルな手動のRMarkdownテーブル
-
[解決済み] データフレームの行を複数の列でソート(並び替え)する。
-
[解決済み] グループ化関数(tapply、by、aggregate)と*applyファミリ
-
[解決済み] Rで2つのグラフを同じプロットで表示する
-
[解決済み] コマンドラインからRスクリプトを実行する
-
[解決済み] ggplot2 を使って 2 つの変数を同じグラフに線でプロットする
-
[解決済み】安定したマッピングを持つggplot2のカテゴリ変数に色を割り当てるには?
-
[解決済み】自作関数を書くときにRの省略機能を使うには?