Shinyの習作、その2です。出力したワードクラウドをPNG形式での保存とデータをテーブルで表示する例です。
紹介コマンドをコピー後にRStudioを利用し「ui.R」と「server.R」を用意、メニューのRun Appの右側下矢印を選択後「Run External」でウェブブラウザで作動させるのがポイントです。そうしないと、PNG形式での保存がうまく動作しません。
RStudioの2022.12.0 Build 353。windows 10のR version 4.2.2で動作を確認しています。
コマンドの紹介
詳細はコマンド、各パッケージのヘルプを確認してください。
ui.Rの内容
#ui.R
#可変レイアウト
shinyUI(fluidPage(
#タイトルを指定
titlePanel("PubMedでWordCloud"),
#1行目:可変レイアウト
fluidRow(plotOutput("WordCloud", width = "100%")),
#2行目:可変レイアウト
fluidRow(
#1列目
column(2, textInput("QueryWord", "クエリ", "クエリを入力"),
textInput("GetPaper", "取得論文数", "100"),
actionButton("GoWordCloud", "ワードクラウドを作成")),
#2列目
column(3, sliderInput("CountWord", "単語出現数", min = 1, max = 20, value = 5, step = 1),
#画像保存用のボタン
downloadButton("image", "プロットをPNGで保存")),
#2列目
column(5, p("出現単語表"), dataTableOutput("table"))
)
)
)
server.Rの内容
#server.R
#パッケージの読み込み
if (!require("easyPubMed")) {
install.packages("easyPubMed")}
if (!require("tm")) {
install.packages("tm")}
if (!require("wordcloud")) {
install.packages("wordcloud")}
if (!require("tcltk")) {
install.packages("tcltk")}
shinyServer(function(input, output) {
#ui.Rからの入力の処理を調整するreactiveコマンド
#QueryWordでPubMedを検索してタイトルを取得:GetWordCloudData処理
GetWordCloudData <- reactive({
#GoWordCloudボタンを押すまでisolateコマンド内を処理しない
input$GoWordCloud
isolate(
if("クエリを入力" == input$QueryWord){
}else{
#結果の取得
ALL_Result <- get_pubmed_ids(input$QueryWord)
GetResult <- fetch_pubmed_data(ALL_Result,
retmax = input$GetPaper, format = "xml")
#論文タイトルを取得
TitleData <- unlist(xpathApply(GetResult, "//ArticleTitle", xmlValue))
###テキストマイニングの設定、お好みに合わせてください#####
CorMaster <- Corpus(DataframeSource(data.frame(TitleData))) #コーパスの作成
CorMaster <- tm_map(CorMaster, stripWhitespace) #空白の削除
CorMaster <- tm_map(CorMaster, removeNumbers) #数字の削除
CorMaster <- tm_map(CorMaster, removePunctuation) #句読点の削除
CorMaster <- tm_map(CorMaster, removeWords, stopwords("english")) #and, or等の削除
TermVec <- DocumentTermMatrix(CorMaster) #タームマトリックスの集計
########
###単語解析結果をデータフレーム化#####
#単語の出現率を集計
AnalyticsAllWords <- as.data.frame(apply(TermVec, 2, sum))
AnalyticsAllWords <- cbind(rownames(AnalyticsAllWords), AnalyticsAllWords)
#除去したい単語を設定
AnalyticsAllWords <- subset(AnalyticsAllWords,
!(AnalyticsAllWords[, 1] %in% c("the", "this", "can", "thus", "these")))
########
})
})
#使い回しするためにワードプロット用のデータは関数で処理
#ワードプロットを作成:PlotWordCloud関数
PlotWordCloud <- function(){
#理解しやすいようにGetWordCloudData処理で得た結果をAnalyticsAllWordsに代入
AnalyticsAllWords <- GetWordCloudData()
#GetWordCloudData処理の結果が何かある場合にワードプロットを作成
if(is.null(AnalyticsAllWords) == FALSE){
#GetWordCloudData処理で得た結果から出現数がCountWord以上を抽出
AnalyticsWords <- subset(AnalyticsAllWords,
AnalyticsAllWords[, 2] >= input$CountWord)
#出現回数で降順
AnalyticsWords <- AnalyticsWords[order(AnalyticsWords[, 2], decreasing = TRUE),]
#データ名
colnames(AnalyticsWords) <- c("単語", "出現回数")
AnalyticsWords
}else{}
}
#plotOutputに出力するrenderPlotコマンド
#ワードプロットをui.RのWordCloudに出力:output$WordCloud処理
output$WordCloud <- renderPlot({
#GetWordCloudData処理結果に何かある場合にワードプロットを作成
if(is.null(PlotWordCloud()) == FALSE){
#ワードプロット
#関数なので()を記述
wordcloud(PlotWordCloud()[, 1], PlotWordCloud()[, 2], scale = c(8, .1),
random.order = FALSE, rot.per = .10, colors = brewer.pal(8, "Dark2"))
}else{}
})
#dataTableOutputに出力するrenderDataTableコマンド
#ワードプロットデータをui.RのdataTableOutputに出力:output$table処理
output$table <- renderDataTable(
expr = PlotWordCloud(),
options = list(pageLength = 5)
)
#webブラウザで実行した際に画像等を保存するdownloadHandlerコマンド
#ワードプロットをpngで保存:output$image処理
#webブラウザで実行時のみ動作
output$image <- downloadHandler(
#ファイル名を指定
filename = function(){"WordCloudPlot.png"},
#処理内容を記述
content = function(file) {
png(file)
wordcloud(PlotWordCloud()[, 1], PlotWordCloud()[, 2], scale = c(8, .1),
random.order = FALSE, rot.per = .10, colors = brewer.pal(8, "Dark2"))
dev.off()
}
)
})
実行例
・Chrome バージョン 56.0.2924.87 (64-bit)での実行例です。Shinyで習作1でも検索した「Leptailurus serval」結果。

少しでも、あなたの解析が楽になりますように!!けものフレンズ「第10話 ろっじ」の配信が楽しみです。