読者です 読者をやめる 読者になる 読者になる

でたぁっ 感動と失敗の備忘録

データ解析を担当することになったサラリーマンの備忘録

ShinyServerで引数をURLから与える

 ShinyServerはクライアントにR環境がなくてもRプログラムをWEBアプリ化することができる。分析などに条件が必要な場合は一般的にui.Rに記述するが、URLに引数として与えることも出来るので他のWEBアプリとの連携も可能みたいだ。このようにGETパラメータ的な実行が可能。

http://xxx.xxx.xxx.xxx:3838/appname/?args1=aaa&args2=bbb&args3=ccc

チュートリアルではこちらに記載されている。

ポイント

 出力部になるserver.Rに記述するshinyServer関数にsessionという引数を追加する。session$clientData$url_searchで受け取り、parseQueryString関数でパースすることが出来る。あとは、その引数に応じたプログラムを実行し結果を出力すれば良い。

shinyServer(function(input, output, session) {
  # Parse the GET query string
  output$queryText <- renderText({
    query <- parseQueryString(session$clientData$url_search)

    # Return a string with key-value pairs
    paste(names(query), query, sep = "=", collapse=", ")
  })
})

 parseQueryString関数はshinyパッケージに存在する。ShinyServerがなくても確認可能。

> library(shiny)
> query <- parseQueryString('?args1=aaa&args2=bbb&args3=ccc')
> str(query)
List of 3
 $ args1: chr "aaa"
 $ args2: chr "bbb"
 $ args3: chr "ccc"
> query
$args1
[1] "aaa"

$args2
[1] "bbb"

$args3
[1] "ccc"

> 

k-meansの分類数などを引数にして可視化してみた

 irisデータを使用。引数はcenters、iter.max、nstartのk-meansのパラメータ3つ。実行はこんな感じになる。

http://xxx.xxx.xxx.xxx:3838/appname/?k=3&im=100&ns=1000

準備するRコードはこの通り。※テキストとグラフの2つを出力

ui.R

shinyUI(bootstrapPage(

  h3("Parsed query string"),
  verbatimTextOutput("queryText"),

  h3("Plot"),
  plotOutput("Plot")

))


server.R

shinyServer(function(input, output, session) {

  output$queryText <- renderText({
    query <- parseQueryString(session$clientData$url_search)
    paste(names(query), query, sep = "=", collapse=", ")
  })

  output$Plot <- renderPlot({
    query <- parseQueryString(session$clientData$url_search)
    cl <- kmeans(iris[,1:4], centers=as.numeric(query$k), iter.max=as.numeric(query$im), nstart=as.numeric(query$ns))
    plot(iris[,1:4], col=cl$cluster)
  })

})

f:id:deta:20140416074806p:plain