再一次,我觉得我错过了很简单的事情。
我正试图在一个闪亮的应用程序中添加一个用户界面,该界面在表格的最左侧列中有单选按钮。选择按钮将确定在后续分析中使用哪些数据。
到目前为止,我已经设法根据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)
}
答案 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代码,但它是一个可推广的过程
radio_html
radio_table
。确保inputId
和radio_html
的{{1}}参数相等。radio_table