单选按钮作为表的一部分

时间:2015-11-05 19:46:48

标签: r shiny

再一次,我觉得我错过了很简单的事情。

我正试图在一个闪亮的应用程序中添加一个用户界面,该界面在表格的最左侧列中有单选按钮。选择按钮将确定在后续分析中使用哪些数据。

到目前为止,我已经设法根据answers to this question获取表格中的单选按钮,但是当我选择不同的单选按钮时,我似乎无法获得与输入相对应的无效值。

我非常感谢您对我所缺失的一些指导。

ui.R

library(shiny)

shinyUI(fluidPage(
  titlePanel("Radio Matrix"),
  sidebarLayout(
    sidebarPanel(  ),
    mainPanel(
      tabsetPanel(
        tabPanel(title = "Selection",
          br(),
          uiOutput("table"),
          verbatimTextOutput("gear"),
          verbatimTextOutput("reactive_gear")
        )
      )
    )
  )
))

server.R

library(shiny)

shinyServer(function(input, output) {
  values <- reactiveValues(gear = 3)

  output$table <- 
    renderText({
      f.changeSelectedRow()
      "<!--html_preserve--><table style = 'border-collapse:collapse;'>
      <tr>
        <th colspan = '1'; rowspan = '1'; style=''></th>\n
        <th colspan = '1'; rowspan = '1'; style=''>gear</th></tr>\n\n
      <tr>
        <td colspan = '1'; rowspan = '1'; style='text-align:center;background-color:#DCDCDC;'><input type='radio' name='gear' value='3 checked = 'checked> </td>\n
        <td colspan = '1'; rowspan = '1'; style='text-align:center;background-color:#DCDCDC;'>3</td></tr>\n\n
      <tr>
        <td colspan = '1'; rowspan = '1'; style='text-align:center;background-color:#F5F5F5;'><input type='radio' name='gear' value='4 checked = '> </td>\n
        <td colspan = '1'; rowspan = '1'; style='text-align:center;background-color:#F5F5F5;'>4</td></tr>\n\n
      <tr>
        <td colspan = '1'; rowspan = '1'; style='text-align:center;background-color:#DCDCDC;'><input type='radio' name='gear' value='5 checked = '> </td>\n
        <td colspan = '1'; rowspan = '1'; style='text-align:center;background-color:#DCDCDC;'>5</td></tr>\n
      </table><br/><br/>\n<!--/html_preserve-->"
    })

  f.changeSelectedRow = reactive({
    if(is.null(values$gear)) values$gear <- 3
    if(!is.null(input$gear))   ### from the radio button set.
             if(input$gear != values$gear) values$gear <- input$gear
  })

  output$gear <- renderText(input$gear)
  output$reactive_gear <- renderText(values$gear)

})

返回output$table的表由一系列函数生成,最终将HTML代码作为字符串输出。我只提供了硬编码到renderText的HTML代码的简化版本,因为我怀疑HTML代码不是问题(虽然我没错)。

我用来生成单选按钮代码的功能是:

radio_html <- function(inputId, label, choices, selected=NULL) {
  if (is.null(selected)) selected <- choices[1]

  paste0("<input type='radio' name='", 
         inputId, "' value='", choices,
         " checked = '",
         ifelse(choices == selected, "checked", ""),
         "> ", label)
}

2 个答案:

答案 0 :(得分:1)

查看?radioButtons的HTML输出,你需要通过将它们包装在

中来说明它们对这些值的反应。
<div id='gear' class='form-group shiny-input-radiogroup shiny-input-container'>
      <div class='shiny-options-group'>
      <!-- HTML here -->
      </div>
</div>

此外,您需要将输入类设置为shiny-bound-input,这是一个快速响应自定义HTML的示例:

library(shiny)

ui <- shinyUI(fluidPage(
  titlePanel("Radio Matrix"),
  sidebarLayout(
    sidebarPanel(  ),
    mainPanel(
      tabsetPanel(
        tabPanel(title = "Selection",
                 br(),
                 uiOutput("table"),
                 verbatimTextOutput("gear"),
                 verbatimTextOutput("reactive_gear")
        )
      )
    )
  )
))

server <- shinyServer(function(input, output) {

  output$table <- 
    renderText({
      '
      <div id="dist" class="form-group shiny-input-radiogroup shiny-input-container">
      <label class="control-label" for="dist">Distribution type:</label>
      <div class="shiny-options-group">
      <div class="radio">
      <label>
      <input type="radio" name="dist" value="norm" checked="checked"/>
      <span>Normal</span>
      </label>
      </div>
      <div class="radio">
      <label>
      <input type="radio" name="dist" value="unif"/>
      <span>Uniform</span>
      </label>
      </div>
      <div class="radio">
      <label>
      <input type="radio" name="dist" value="lnorm"/>
      <span>Log-normal</span>
      </label>
      </div>
      <div class="radio">
      <label>
      <input type="radio" name="dist" value="exp"/>
      <span>Exponential</span>
      </label>
      </div>
      </div>
      </div> 
      '
    })

  output$reactive_gear <- renderText(input$dist)

})

shinyApp(ui=ui,server=server)

同时检查你是否有适量的报价,我认为你的radio_html函数中缺少一些。希望这可以帮助!

答案 1 :(得分:1)

这个答案的所有功劳都归功于奥斯卡。在研究了他的例子后,我设法制定了一对可以一起使用以获得所需外观的功能。

这需要一个开发版本包来生成格式化表格的html代码,但它是一个可推广的过程

  1. 创建数据框
  2. 使用radio_html
  3. 添加一列单选按钮
  4. 将数据框转换为HTML表格
  5. 将该html代码运行到radio_table。确保inputIdradio_html的{​​{1}}参数相等。
  6. radio_table