2016-03-03 8 views
5

私は複数の選択項目の評価ツールとしてShinyを使用しようとしています。したがって、場合によっては画像を選択肢として使用したいと考えています。代わりに、生のHTMLが表示されます。これはシャイニーでできますか?イメージを光沢のあるラジオボタンの選択肢として使用できますか?

library(shiny) 

choices <- c('\\(e^{i \\pi} + 1 = 0 \\)' = 'equation', 
      '<img src="Rlogo.png">' = 'logo') 

ui <- shinyUI(fluidPage(
    withMathJax(), 
    img(src='Rlogo.png'), 
    fluidRow(column(width=12, 
     radioButtons('test', 'Radio buttons with MathJax choices', 
        choices = choices, inline = TRUE), 
     br(), 
     h3(textOutput('selected')) 
    )) 
)) 

server <- shinyServer(function(input, output) { 
    output$selected <- renderText({ 
     paste0('You selected the ', input$test) 
    }) 
}) 

shinyApp(ui = ui, server = server) 

あなたはこのapp.rスクリプトを置くwwwディレクトリにRのロゴを配置する必要があります。名前はspanで開催されたので、すべてのHTMLがエスケープされてtags$spanを使用して生成されるため、http://i1.wp.com/www.r-bloggers.com/wp-content/uploads/2016/02/Rlogo.png?resize=300%2C263

答えて

3

imgがラジオボタンに表示されていません。ここでは、ロゴへの直接リンクです。

あなたは一度だけこれをしなければならない場合は、画像、radioButtons('test', 'Radio buttons with MathJax choices', choices = choices, inline = TRUE)の出力をコピーtags$divに置き、そして追加することができます:あなたはこの何回も行う必要がある場合、

 fluidRow(column(width=12, 
         tags$div(HTML('<div id="test" class="form-group shiny-input-radiogroup shiny-input-container shiny-input-container-inline"> 
    <label class="control-label" for="test">Radio buttons with MathJax choices</label> 
             <div class="shiny-options-group"> 
             <label class="radio-inline"> 
             <input type="radio" name="test" value="equation" checked="checked"/> 
             <span>\\(e^{i \\pi} + 1 = 0 \\)</span> 
             </label> 
             <label class="radio-inline"> 
             <input type="radio" name="test" value="logo"/> 
             <span><img src="http://i1.wp.com/www.r-bloggers.com/wp-content/uploads/2016/02/Rlogo.png?resize=300%2C263"/></span> 
             </label> 
             </div> 
             </div> ')), 
         br(), 
         h3(textOutput('selected')) 
     )) 

をあなたがすることができますradioButtons_withHTML関数を定義:

radioButtons_withHTML <- function (inputId, label, choices, selected = NULL, inline = FALSE, 
      width = NULL) 
{ 
     choices <- shiny:::choicesWithNames(choices) 
     selected <- if (is.null(selected)) 
       choices[[1]] 
     else { 
       shiny:::validateSelected(selected, choices, inputId) 
     } 
     if (length(selected) > 1) 
       stop("The 'selected' argument must be of length 1") 
     options <- generateOptions_withHTML(inputId, choices, selected, inline, 
            type = "radio") 
     divClass <- "form-group shiny-input-radiogroup shiny-input-container" 
     if (inline) 
       divClass <- paste(divClass, "shiny-input-container-inline") 
     tags$div(id = inputId, style = if (!is.null(width)) 
       paste0("width: ", validateCssUnit(width), ";"), class = divClass, 
       shiny:::controlLabel(inputId, label), options) 
} 

generateOptions_withHTML <- function (inputId, choices, selected, inline, type = "checkbox") 
{ 
     options <- mapply(choices, names(choices), FUN = function(value, 
                    name) { 
       inputTag <- tags$input(type = type, name = inputId, value = value) 
       if (value %in% selected) 
         inputTag$attribs$checked <- "checked" 
       if (inline) { 
         tags$label(class = paste0(type, "-inline"), inputTag, 
            tags$span(HTML(name))) 
       } 
       else { 
         tags$div(class = type, tags$label(inputTag, tags$span(HTML(name)))) 
       } 
     }, SIMPLIFY = FALSE, USE.NAMES = FALSE) 
     div(class = "shiny-options-group", options) 
} 

オリジナルのものとの違いは、ボタンの名前を作成するための呼び出しgenerateOptions_withHTMLある、と私は周りHTML()機能を追加しましたエスケープを防ぐためにtags$spanの210。これらの関数を別のファイルに入れて、sourceを使用することができます。

radioButtons_withHTML('test', 'Radio buttons with MathJax choices',choices = choices, inline = TRUE)を使用してradioButtonsを作成することができます。

+0

ありがとうございます!これはまさに私が必要としていたものです。 Rstudioがこれを主なShinyリリースに組み込んだ方がいいでしょう。 – jbryer

関連する問題